<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: net_flow/detail/low_lvl_packet.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_460afd45d0ec637b1427e0e06a6fbcf7.html">net_flow</a></li><li class="navelem"><a class="el" href="dir_6dd0f5e913f2b13fdf6025047ac045ce.html">detail</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">low_lvl_packet.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="low__lvl__packet_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="detail_2net__flow__fwd_8hpp.html">flow/net_flow/detail/net_flow_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;<a class="code" href="seq__num_8hpp.html">flow/net_flow/detail/seq_num.hpp</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &quot;<a class="code" href="net__flow__fwd_8hpp.html">flow/net_flow/net_flow_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="preprocessor">#include &quot;<a class="code" href="log_8hpp.html">flow/log/log.hpp</a>&quot;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="preprocessor">#include &quot;<a class="code" href="util_2util_8hpp.html">flow/util/util.hpp</a>&quot;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="preprocessor">#include &quot;<a class="code" href="shared__ptr__alias__holder_8hpp.html">flow/util/shared_ptr_alias_holder.hpp</a>&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="preprocessor">#include &quot;<a class="code" href="blob_8hpp.html">flow/util/blob.hpp</a>&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="preprocessor">#include &lt;boost/endian.hpp&gt;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span><span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="preprocessor">#include &lt;type_traits&gt;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span>{</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment"></span> </div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment">/**</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="comment"> * Internal `net_flow` `struct` that encapsulates the Flow-protocol low-level packet structure and serves as</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span><span class="comment"> * the super-type for all specific packet types, represented by derived `struct`s like Ack_packet, Rst_packet,</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="comment"> * etc.</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment"> *</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment"> * This `struct` and its sub-`struct` hierarchy are not too complex but nevertheless are somewhat unorthodox,</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment"> * combining a few different paradigms.  So it&#39;s worth explaining these paradigms.</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment"> *</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment"> * ### Paradigm: Data store ###</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment"> * This is a `struct` holding the conceptual contents of a packet.  Low_lvl_packet stores common values like</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"> * #m_opt_rexmit_on, #m_src_port, and a few more.  Each sub-`struct` stores further values specific to each</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment"> * packet type; for example, as of this writing, Data_packet::m_data contains the data payload of a DATA</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment"> * packet; this would not apply, for example, to another sub-`struct` like Rst_packet, because an RST stores</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment"> * no binary blob like that.</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="comment"> *</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span><span class="comment"> * Since it&#39;s a simple data store, the applicable data members (in this `struct` and the sub-types) are</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"> * both public AND non-`const`.  They can be read and written at will, thus changing or reading the</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment"> * logical contents of the packet.</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment"> *</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment"> * ### Paradigm: Polymorphic type ###</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment"> * While a simple data store, it also represents a hierarchy of possible packet types, and indeed a number</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment"> * of important polymorphic operations are included.  Some are private/internal, and some are public.</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment"> * A public method may not appear polymorphic by its signature, but in that case usually its implementation</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment"> * uses non-public `virtual` methods to accomplish its tasks.  Specifically, the key APIs are:</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="comment"> *</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"> *   - `create_uninit_packet&lt;T&gt;()`: This creates an uninitialized sub-object of Low_lvl_packet, of actual</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment"> *     type `T`, where `T` derives from Low_lvl_packet.  This returns a `shared_ptr&lt;T&gt;`, and any actual</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment"> *     constructor used to implement this factory method is non-public, so the only way for a user to</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment"> *     create a Low_lvl_packet is to get at a ref-counted pointer to it -- not a raw, unprotected pointer.  If storing</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span><span class="comment"> *     only `shared_ptr&lt;T&gt;` or `Ptr` values, deletion is not something to worry about, as it will happen</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="comment"> *     automatically.</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="comment"> *     - Same with the other factory methods described just below.  Direct access to `Low_lvl_packet*` or</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="comment"> *       `T*`, where `T` derives from Low_lvl_packet, is not allowed (but this is not enforced at compile time</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="comment"> *       and, at best, via `assert()`s at runtime).</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span><span class="comment"> *   - create_from_raw_data_packet(): Given a raw serialized packet, this factory method constructs</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span><span class="comment"> *     a Low_lvl_packet of the appropriate polymorphic sub-type, filling it at all levels with the data</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="comment"> *     deserialized for the input binary blob.  Internally, it uses some private, `virtual` action to get this</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span><span class="comment"> *     to work.  At any rate, this method is used to crete a logical representation of a packet off the wire.</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment"> *   - serialize_to_raw_data(): The opposite operation: convert existing object to raw data sendable over the wire.</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span><span class="comment"> *     This uses a high-performance scatter-gather paradigm of producing a sequence of pointers and lengths to</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment"> *     already existing data areas, avoiding copying.  This thing is `virtual` and applies to any Low_lvl_packet</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment"> *     sub-object.</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment"> *</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="comment"> * (Reminder: As with all polymorphism and `shared_ptr`, you may need `static_pointer_cast&lt;&gt;` to up- and down-cast</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment"> * between Low_lvl_packet and subclasses.  Also `Low_lvl_packet::ptr_cast()` up-casts even syntactically-sugarier-ly.)</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment"> *</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment"> * The two basic flows are:</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment"> *   - Call `create_uninit_packet&lt;T&gt;()` to construct a sub-`struct` of Low_lvl_packet, returned as a ref-counted</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment"> *     pointer to `T`.  Fill out all the fields manually, accessing object via aforemetioned smart pointer.</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment"> *     Call serialize_to_raw_data().  Pass result of latter to a boost.asio network-sending routine</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment"> *     to send over wire.  Ensure you pass a `Ptr` to the completion handler passed to that routine, so that</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment"> *     the Low_lvl_packet survives while being sent.  The handler can let the `Ptr` go out of scope, likely</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment"> *     `delete`ing the Low_lvl_packet.</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment"> *   - Receive raw packet over wire.  Call create_from_raw_data_packet() to yield a Low_lvl_packet::Ptr pointing</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment"> *     to new Low_lvl_packet sub-object with all fields filled out.  Read the fields as needed to process the</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment"> *     packet; store the `Ptr` if necessary; eventually removing it from all data structures will drop ref-count</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment"> *     to zero, and it will be auto-`delete`d.</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span><span class="comment"> *</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span><span class="comment"> * ### Other utlities ###</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="comment"> * A number of (typically polymorphic) facilities exist, mainly to log these objects to `ostream`s, including</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment"> * when logging with FLOW_LOG_TRACE() and FLOW_LOG_DATA().</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment"> *</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment"> *   - #m_verbose_ostream_manip and #m_concise_ostream_manip are `const` data members that can be output</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment"> *     via the usual `&lt;&lt;` operator to `ostream`s in order to output verbose and concise descriptions</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment"> *     of any Low_lvl_packet (of any sub-`struct` type, polymorphically).</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span><span class="comment"> *   - #m_type_ostream_manip can be similarly used to output just the packet type of any given</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span><span class="comment"> *     Low_lvl_packet (producing strings like `&quot;ACK&quot;` or `&quot;RST&quot;`).</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span><span class="comment"> *</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment"> * The implementation of these is typically some polymorphic `virtual` magic, but the use is straightforward using</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment"> * these `ostream` manipulator data members.</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment"> *</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment"> * Implementation notes</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment"> * --------------------</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment"> *</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment"> * ### History of approaches ###</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment"> * Originally the implementation used the boost.serialization library for packet serialization, but</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment"> * it turned out to consume way too much CPU time which consequently limited the maximum</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment"> * throughput at high speeds.  The next implementation used the traditional approach based on</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment"> * &quot;packed&quot; structures (structures without any padding), in one big `struct Low_lvl_packet`.</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment"> * However, I deemed the latter setup too C-like (yet simultaneously</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span><span class="comment"> * not C-like enough, in that no unions were used, hence RAM was wasted despite the C-like approach).</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span><span class="comment"> * Ultimately, the current version of the implementation came about, with its polymorphic `struct` hierarchy</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment"> * and abstract Low_lvl_packet `struct` (which, in the previous iteration, simply contained everything</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment"> * about every type, complete with an `enum Type` instead of using C++&#39;s built-in `typeid`, as the current</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment"> * version uses).</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment"> *</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment"> * While the above evolution was more about coding style philosophy (from a single type and a type selector</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment"> * `enum` to a polymorphic hierarchy and `typeid`), the other evolution concerned the way serialization</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment"> * (for sending over the write) worked.  At first, as mentioned, there were the logical values (which were</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment"> * public and non-`const`), and there were private packed `struct`s into which the logical values were</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment"> * placed (with transformation for endianness and other things) at serialization time; finally then assembling</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment"> * a newly allocated single binary buffer, those packed `struct`s copied into it.  Not bad -- rather verbose</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment"> * having all those types defined, but not bad -- but it did involve a new buffer and linear-time copying into</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment"> * that buffer.  This seemed like a shame.</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment"> *</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span><span class="comment"> * This led to the final improvement, which was to turn the serialization function into one that generates</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment"> * a `boost::asio::const_buffer_sequence`, basically a sequence of pointers and associated lengths of areas</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment"> * already present in memory.  In most cases (with a couple small exceptions), the stored public data members</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment"> * (e.g., #m_src_port and Data_packet::m_data) could simply have their addresses and lengths taken and placed</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment"> * into the `const_buffer_sequence` -- no buffer copying involved.  This should achieve a nice performance</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment"> * improvement.  The removal of things like `struct Common_header` and `struct Ack_header` is a good bonus</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span><span class="comment"> * coding-wise, too.</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment"> *</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment"> * (There is a caveat there.  While no issue for the true performance culprits, namely Data_packet::m_data,</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment"> * the various multi-byte integer values like #m_src_port technically have to undergo endianness conversion</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment"> * during serialization.  So technically simply taking an address and size is not enough; the value needs</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment"> * to be flipped *potentially*.  In reality, though, all relevant architectures are such that we chose</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment"> * identical network byte order as memory byte order, making no flipping necessary in practice.  Of course,</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment"> * if we spread to an architecture where this is not true, everything will explode.  However, a compile-time</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment"> * assertion would warn us of this, and a nearby comment will instruct on how to deal with the problem, in the</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment"> * unlikely case it were to appear.  [Little-endian is rather universal these days.])</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span><span class="comment"> *</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment"> * ### Packed structures, stored integers, and alignment ###</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment"> * When 2 or more contiguous data members are used in serializing (serialize_to_raw_data() or overridden</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="comment"> * version), they are packed together via `&quot;#pragma pack&quot;`.  (Note that this affect entire `struct`s at a time</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span><span class="comment"> * only; hence we need to use some anonymously-typed grouping `struct`s named `m_packed`.)</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span><span class="comment"> *</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="comment"> * Numeric values are stored as unsigned integers, which is the most portable choice for serializing.</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span><span class="comment"> * Booleans are serialized as bytes for compactness.</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span><span class="comment"> *</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span><span class="comment"> * Some effort is made to keep fields aligned along word edges when serializing.  There is not too much</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span><span class="comment"> * of that as of this writing, but we should remain vigilant as packet formats become more complex over time.</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span><span class="comment"> *</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span><span class="comment"> * @todo With C++11, some lines of code could be eliminated by using `using` for Low_lvl_packet sub-types</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span><span class="comment"> * to inherit the constructor(s) of Low_lvl_packet.  (For some of the sub-types an explicit constructor</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment"> * would still be necessary, but it would just shadow the inherited one, which is fine and still saves lines</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span><span class="comment"> * in the other sub-types.)  However, for now I&#39;ve left it as-is, partially to be friendly to the Doxygen</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span><span class="comment"> * documentation generator, and partially to make the interface easy to read.  Still, it may be better the other</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment"> * way.</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment"> */</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">  165</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">Low_lvl_packet</a> :</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span>  <span class="keyword">public</span> <a class="code hl_class" href="classflow_1_1util_1_1Null__interface.html">util::Null_interface</a>,</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span>  <span class="comment">// Endow us with shared_ptr&lt;&gt;s ::Ptr and ::Const_ptr (syntactic sugar).</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span>  <span class="keyword">public</span> <a class="code hl_class" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html">util::Shared_ptr_alias_holder</a>&lt;boost::shared_ptr&lt;Low_lvl_packet&gt;&gt;,</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>  <span class="keyword">public</span> <a class="code hl_class" href="classflow_1_1log_1_1Log__context.html">log::Log_context</a>,</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span>  <span class="keyword">private</span> boost::noncopyable</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>{</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment"></span> </div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment">   * Short-hand for boost.asio immutable buffer, which essentially is a pointer to and length of a memory area.</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment">   *</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="comment">   * @todo Consider moving alias Low_lvl_packet::Const_buffer to `util` namespace or even outside it, as it is</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span><span class="comment">   * used commonly (or `boost::asio::const_buffer` is used where `Const_buffer` could be used for readability).</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span><span class="comment">   */</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">  180</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a> = boost::asio::const_buffer;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span><span class="comment"></span> </div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span><span class="comment">   * Short-hand for sequence of immutable buffers; i.e., a sequence of 1 or more scattered areas in memory.</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span><span class="comment">   * This is a model of the `ConstBufferSequence` model in boost.asio, which means a `const` reference to this</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span><span class="comment">   * can be passed to boost.asio scatter-gathering send functions such as `Udp_socket::async_send_to()`;</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment">   * the scattered buffers represented by an instance of this type will be, at high performance, gathered</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span><span class="comment">   * into a single UDP datagram and sent over the wire if possible.</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span><span class="comment">   */</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">  189</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a> = std::vector&lt;Const_buffer&gt;;</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span><span class="comment"></span> </div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span><span class="comment">  /// Type used for `m_security_token` member of a couple different packet types.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a872044469cfa05a3abf3f9ab1c7cf03b">  192</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a872044469cfa05a3abf3f9ab1c7cf03b">security_token_t</a> = uint64_t;</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span><span class="comment"></span> </div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment">   * Type used to store the retransmission count in DATA and ACK packets.</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment">   *</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="comment">   * Why 8 bits?  This handles up 255 retransmissions, which is long after we&#39;d kill the connection</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span><span class="comment">   * anyway.</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span><span class="comment">   */</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a11e7750d22415a381e23112062f7ca74">  200</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a11e7750d22415a381e23112062f7ca74">rexmit_id_t</a> = <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a>;</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span><span class="comment"></span> </div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span><span class="comment">  /// Type used to store the size of `m_rcv_wnd` member in a couple of different packet types.</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a01ff17bec742d9e363aea2ecd23f2f72">  203</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a01ff17bec742d9e363aea2ecd23f2f72">rcv_wnd_t</a> = uint32_t;</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span> </div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>  <span class="comment">/* Data: These are actual Common Header payload.</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span><span class="comment">   *</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span><span class="comment">   * These are common to all packet types, since we are super-`struct` to all actual packet types.</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span><span class="comment">   *</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span><span class="comment">   * Note the implicit data field typeid(*this) which identifies the actual type of this packet.</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span><span class="comment">   * (C++ subtlety: typeid(this) will just yield typeid(Low_lvl_packet), which isn&#39;t that useful;</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span><span class="comment">   * but typeid(*this) will actually get you typeid(Data_packet), typeid(Ack_packet), etc. */</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span><span class="comment"></span> </div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span><span class="comment">   * Option indicating whether this connection is using retransmission or not.  This value must not</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span><span class="comment">   * change over the course of a connection and is provided in each packet for simpler</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span><span class="comment">   * deserialization (so that the latter can proceed completely without having to check the</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span><span class="comment">   * connection properties).</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span><span class="comment">   *</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span><span class="comment">   * For a given connection handshake, the SYN receiver should either disconnect/RST or respond with</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span><span class="comment">   * SYN_ACK.  If it responds with SYN_ACK, it indicates agreement to abide by this option for the</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span><span class="comment">   * rest of the connection.</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment">   */</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#acc2a10d19e8e54c88518ad2e02a08b68">  223</a></span>  <span class="keywordtype">bool</span> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#acc2a10d19e8e54c88518ad2e02a08b68">m_opt_rexmit_on</a>;</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span> </div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span><span class="preprocessor">#pragma pack(push, 1)</span><span class="comment"></span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="comment">  /// Packed group affected by `#pragma pack`.</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="comment"></span>  <span class="keyword">struct</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>  {</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>    <span class="comment">// Data.</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment"></span> </div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span><span class="comment">    /// Flow-protocol port # of socket in sending Node.</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ae5bd1ed0883b4827d8a81d70c10fd271">  232</a></span><span class="comment"></span>    <a class="code hl_typedef" href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow_port_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ae5bd1ed0883b4827d8a81d70c10fd271">m_src_port</a>;<span class="comment"></span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span><span class="comment">    /// Flow-protocol port # of socket in receiving Node.</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a786030d997a7602733a6a4422cb34274">  234</a></span><span class="comment"></span>    <a class="code hl_typedef" href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow_port_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a786030d997a7602733a6a4422cb34274">m_dst_port</a>;</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a3e7152648c0098491512da590b47b464">  235</a></span>  } <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a3e7152648c0098491512da590b47b464">m_packed</a>;</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span><span class="preprocessor">#pragma pack(pop)</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span> </div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;flow_port_t&gt;::is_integer</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>                  &amp;&amp; (!std::numeric_limits&lt;flow_port_t&gt;::is_signed),</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>                <span class="stringliteral">&quot;Ports are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span> </div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>  <span class="comment">// Data: These are peripheral (not actual packet payload).</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span><span class="comment"></span> </div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span><span class="comment">  /// `ostream` manipulator (argument to `ostream &lt;&lt;`) that will output packet&#39;s type (&quot;ACK&quot;, &quot;RST&quot;, etc.).</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a7f4fd9ce69e293477e96fbad0a2298ed">  246</a></span><span class="comment"></span>  <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1Function.html">Function</a>&lt;std::ostream&amp; (std::ostream&amp;)&gt; <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a7f4fd9ce69e293477e96fbad0a2298ed">m_type_ostream_manip</a>;</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span><span class="comment"></span> </div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span><span class="comment">  /// `ostream` manipulator (argument to `ostream &lt;&lt;`) that will output packet info suitable for DATA log level.</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ae3e64b049838a690384a899209ffca7b">  249</a></span><span class="comment"></span>  <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1Function.html">Function</a>&lt;std::ostream&amp; (std::ostream&amp;)&gt; <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ae3e64b049838a690384a899209ffca7b">m_verbose_ostream_manip</a>;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment"></span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span><span class="comment">  /// `ostream` manipulator (argument to `ostream &lt;&lt;`) that will output packet info suitable for TRACE log level.</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a89bbdc4968a82877de3d7bcba3597c2c">  252</a></span><span class="comment"></span>  <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1Function.html">Function</a>&lt;std::ostream&amp; (std::ostream&amp;)&gt; <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a89bbdc4968a82877de3d7bcba3597c2c">m_concise_ostream_manip</a>;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span> </div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span><span class="comment"></span> </div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span><span class="comment">   * Constructs packet with uninitialized (essentially random) values, of the Low_lvl_packet sub-type specified</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span><span class="comment">   * as the template parameter (Ack_packet, Rst_packet, etc.).  Since any constructor is not public, this is</span></div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span><span class="comment">   * the only way to instantiate a blank Low_lvl_packet sub-object.</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span><span class="comment">   *</span></div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span><span class="comment">   * Compiler template parameter inference should make the following work, so the template parameter can be omitted.:</span></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span><span class="comment">   *</span></div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span><span class="comment">   *   ~~~</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span><span class="comment">   *   shared_ptr&lt;Ack_packet&gt; = create_uninit_packet(get_logger());</span></div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span><span class="comment">   *   // ^-- Low_lvl_packet_sub was inferred to be Ack_packet based on the left hand side of the assignment.</span></div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span><span class="comment">   *   ~~~</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span><span class="comment">   *</span></div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span><span class="comment">   * @tparam Low_lvl_packet_sub</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span><span class="comment">   *         Any type deriving from Low_lvl_packet.</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span><span class="comment">   *        Logger to use subsequently in the new object.</span></div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span><span class="comment">   * @return Ref-counted pointer to newly created object of the specified type.</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment">   *         If you need an up-cast pointer, use create_uninit_packet_base().</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment">   */</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Low_lvl_packet_sub&gt;</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span>  <span class="keyword">static</span> boost::shared_ptr&lt;Low_lvl_packet_sub&gt; <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a09f0f187521ec2275885d68b7f6e734a">create_uninit_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span><span class="comment"></span> </div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span><span class="comment">   * A simple convenience method that casts the result of create_uninit_packet() from `shared_ptr&lt;T&gt;`, where `T` is a</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span><span class="comment">   * sub-type of Low_lvl_packet, to `shared_ptr&lt;Low_lvl_packet&gt;` a/k/a Ptr.</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span><span class="comment">   *</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span><span class="comment">   *        See create_uninit_packet().</span></div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment">   * @return See create_uninit_packet() (but cast to a type compatible with the polymorphic base type).</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment">   */</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Low_lvl_packet_sub&gt;</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>  <span class="keyword">static</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a64981689c6d162131889bd90ef003279">create_uninit_packet_base</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span><span class="comment"></span> </div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span><span class="comment">   * Constructs packet on the heap with values determined by the given raw binary data as presumably</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span><span class="comment">   * received from the wire and originally serialized by a compatible serializing Node.  The returned</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span><span class="comment">   * value is a reference-counted pointer with a reference count of 1 (i.e., no other references to</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span><span class="comment">   * underlying object have been saved anywhere by the time method returns).</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span><span class="comment">   *</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span><span class="comment">   * It is the opposite of serialize_to_raw_data() but not symmetrically efficient; where the latter</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span><span class="comment">   * produces a sequence of pointers/lengths of already present areas of memory (no copying), the present method</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span><span class="comment">   * copies the raw data into a new structure and is thus less efficient.</span></div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span><span class="comment">   *</span></div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span><span class="comment">   * Suppose `ptr` is returned.  Then `*ptr` is of polymorphic type `Low_lvl_packet*` but actually is</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span><span class="comment">   * of some specific sub-type (like `Ack_packet*`).  `typeid(*ptr)` can be used to determine the exact type.</span></div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span><span class="comment">   * In particular one can write things like: `bool is_ack = typeid(*ptr) == typeid(Ack_packet)`.</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span><span class="comment">   * Of course, in many cases one may call one of a number of virtual methods of Low_lvl_packet to get</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span><span class="comment">   * type-specific polymorphic behavior.</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span><span class="comment">   *</span></div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span><span class="comment">   * @see m_type_ostream_manip() for easy way to output human-readable version of `typeid(*ptr).name()`, where</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span><span class="comment">   *      `ptr` is the value returned.</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span><span class="comment">   *        Pointer to entire packet raw buffer as received over the wire.</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span><span class="comment">   *        Upon return, the state of `*raw_packet` is not known; and caller retains</span></div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span><span class="comment">   *        ownership of it (e.g., can read another datagram into it if desired).  As of this writing it will either</span></div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span><span class="comment">   *        remain unchanged or be emptied (via a move elsewhere) -- but ideally code without relying on either specific</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span><span class="comment">   *        outcome.</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span><span class="comment">   *        If `true`, the method should (if at all reasonable) not alter `raw_packet-&gt;capacity()` (in particular</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span><span class="comment">   *        it should not use move semantics to send its contents to another data structure); otherwise</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span><span class="comment">   *        it should be free to do so (i.e., if it considers doing so beneficial for performance reasons).</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span><span class="comment">   *        Will be used to log within this method as well as be saved as the</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span><span class="comment">   *        `Logger*` in the new Low_lvl_packet created and returned (if any).</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span><span class="comment">   * @return A null pointer on failure; otherwise pointer to an object of some sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span><span class="comment">   */</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>  <span class="keyword">static</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a186d7dae0c4b4402aed22a25d595ed30">create_from_raw_data_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet, <span class="keywordtype">bool</span> prefer_no_move);</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span><span class="comment"></span> </div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span><span class="comment">   * Serializes the current logical packet data from `*this` into the given `Const_buffer_sequence`,</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span><span class="comment">   * which is a sequence of pointers and lengths of existing scattered areas in memory, presumably</span></div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span><span class="comment">   * for transmission over the wire to a compatible serializing Node.</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span><span class="comment">   *</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span><span class="comment">   * It is the opposite of create_from_raw_data_packet() but not symmetrically efficient; where the latter</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span><span class="comment">   * copies the raw data into a new structure, the present method produces a sequence of pointers/lengths</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span><span class="comment">   * of already present areas of memory (no copying) and is thus more efficient.</span></div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span><span class="comment">   *</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span><span class="comment">   * The input `*raw_bufs` is appended to and is *not* cleared by this method.  Thus one may use this</span></div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span><span class="comment">   * method to produce a larger buffer sequence of which the serialization of `*this` is only a part</span></div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span><span class="comment">   * (possibly in the middle somewhere).</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span><span class="comment">   *</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span><span class="comment">   * Behavior is undefined if one modifies `*this` after calling the present method.  It is safer to</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span><span class="comment">   * run this on a `const Low_lvl_packet` rather than a mutable Low_lvl_packet.</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span><span class="comment">   *</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span><span class="comment">   * @warning This efficiency comes with an important caveat: the generated additions to `*raw_bufs` will</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span><span class="comment">   *          remain valid *only* while `*this` exists.  If its destructor runs, the buffers added here</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span><span class="comment">   *          will become invalid, and accessing them will result in undefined behavior.</span></div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span><span class="comment">   *</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span><span class="comment">   *        Pointer to the sequence of `Const_buffer`s into which we will append pointers/lengths</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span><span class="comment">   *        of serialized data.</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span><span class="comment">   * @return Size in bytes of the data references to which have been appended to `*raw_bufs`;</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span><span class="comment">   *         Already present data are not included.</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span><span class="comment">   */</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#aa2b4697824bd3ca88970c67d9a1f3e76">  350</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#aa2b4697824bd3ca88970c67d9a1f3e76">serialize_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const</span> = 0;</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span><span class="comment"></span> </div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span><span class="comment">   * Identical to serialize_to_raw_data() but adds log-level-appropriate logging after the operation.</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span><span class="comment">   *</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span><span class="comment">   *        See serialize_to_raw_data().</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span><span class="comment">   * @return See serialize_to_raw_data().</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span><span class="comment">   */</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a5856c405aa18f4f54a35515786befea8">serialize_to_raw_data_and_log</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span><span class="comment"></span> </div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span><span class="comment">   * Returns a brief (a few characters) string description of the given packet type given as</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span><span class="comment">   * `type_index(typeid(p))`, where `p` is a reference to an instance of a concrete Low_lvl_packet sub-type.</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span><span class="comment">   *</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span><span class="comment">   * @param type_id</span></div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span><span class="comment">   *        See above.  If the `p` points to a value of some other type, behavior is undefined.</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span><span class="comment">   * @return Reference to a string without newlines or other whitespace: &quot;DATA&quot;, &quot;ACK&quot;, &quot;SYN_ACK_ACK&quot;, etc.</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span><span class="comment">   */</span></div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>  <span class="keyword">static</span> <span class="keyword">const</span> std::string&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a37c9c6b04502d73defb803c1efabdf63">type_id_to_str</a>(<span class="keyword">const</span> std::type_index&amp; type_id);</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span> </div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span><span class="keyword">protected</span>:</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span><span class="comment"></span> </div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span><span class="comment">   * Constructs packet with uninitialized (essentially random) values.  This is not public, because</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span><span class="comment">   * a Low_lvl_packet is meaningless without being of some specific sub-type referring to an actual</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span><span class="comment">   * packet (e.g., Ack_packet, Rst_packet, etc.).  (The presence of pure virtual methods would probably</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span><span class="comment">   * accomplish this too, but it&#39;s nice to be explicit.)</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span><span class="comment">   *</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span><span class="comment">   *        Logger to use subsequently.</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span><span class="comment">   */</span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a4a0585d1abae63af891161f1719bc582">Low_lvl_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span> </div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span><span class="comment"></span> </div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span><span class="comment">   * Helper for serialize_to_raw_data() implementations in sub-types that encodes the header common to all</span></div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span><span class="comment">   * packet types, starting with the packet type ID leading that header.</span></div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span><span class="comment">   *</span></div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span><span class="comment">   *        See serialize_to_raw_data().  Header fields are encoded and appended to this.</span></div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span><span class="comment">   * @return See serialize_to_raw_data().  The total # of bytes encoded and appended to `*raw_bufs` by the call.</span></div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span><span class="comment">   */</span></div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ac7b199700e34d3cc17a7653d7bbb134b">serialize_common_header_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span><span class="comment"></span> </div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span><span class="comment">   * Writes a multi-line representation of `*this` to an output stream.</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span><span class="comment">   *</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span><span class="comment">   * Unless the sub-type needs to add no information of its own (as of this writing, the case for Rst_packet),</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span><span class="comment">   * this implementation (of this virtual method) is only present as a utility for the sub-types.</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span><span class="comment">   * The sub-type is recommended to first call this implementation; then add type-specific lines</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span><span class="comment">   * afterwards, ending with a newline.  Following this recommendation will result in uniform, decent-looking</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span><span class="comment">   * overall output.</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span><span class="comment">   *</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span><span class="comment">   * @note This is protected, because it is meant only to be used in the implementation of</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span><span class="comment">   *       the `ostream` manipulators #m_verbose_ostream_manip and #m_concise_ostream_manip, which</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span><span class="comment">   *       are public and to be used by users of this type.</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span><span class="comment">   *        The output stream to use.  Normally I&#39;d make this a pointer, but this non-constant reference is</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span><span class="comment">   *        fairly typical in STL and the world in general, for `ostream` in particular.</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span><span class="comment">   * @param verbose</span></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span><span class="comment">   *        If `false`, output suitable for TRACE level logging is produced; otherwise for DATA level logging.</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span><span class="comment">   * @return `os`.</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span><span class="comment">   */</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span>  <span class="keyword">virtual</span> std::ostream&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a47e9143f0b9dd4ae9d8c5ace666d5539">to_ostream</a>(std::ostream&amp; os, <span class="keywordtype">bool</span> verbose = <span class="keyword">false</span>) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span><span class="comment"></span> </div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span><span class="comment">   * Returns `true`, at compile time, if and only if the native memory representation is big-endian, meaning,</span></div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span><span class="comment">   * for example, the value `uint32_t(1)` is stored as the bytes, in order, 0x00 0x00 0x00 0x01, and not the reverse.</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span><span class="comment">   * Can be used in a compile-time check such as `static_assert()`.</span></div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span><span class="comment">   *</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span><span class="comment">   */</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a57c06fd2d0b1c3ac058c13f9081067f0">native_is_big_endian</a>();</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span> </div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span> </div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span><span class="preprocessor">#pragma pack(push, 1)</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span><span class="comment"></span> </div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span><span class="comment">   * Helper data store type for storing binary data needed by serialize_to_raw_data(), when certains bits</span></div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span><span class="comment">   * are not already represented by the public data members present in `struct` Low_lvl_packet.</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span><span class="comment">   *</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span><span class="comment">   * The need for this is somewhat subtle and is explained fully inside Low_lvl_packet::serialize_to_raw_data(),</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span><span class="comment">   * so I won&#39;t go into it here.  Also see each data member&#39;s doc header.</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span><span class="comment">   */</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html">  439</a></span>  <span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html">Aux_raw_data</a> :</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span>    <span class="keyword">private</span> boost::noncopyable</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span>  {<span class="comment"></span></div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span><span class="comment">    /**</span></div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span><span class="comment">     * This is the serialized version of the multi-byte `bool` Low_lvl_packet::m_opt_rexmit_on.</span></div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span><span class="comment">     * Since the latter is of a more civilized `bool` type, and we need a single byte version, this here</span></div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span><span class="comment">     * is set to the obvious encoding of the `bool`, when Low_lvl_packet::serialize_to_raw_data() needs to</span></div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span><span class="comment">     * serialize said `bool`.</span></div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span><span class="comment">     */</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a22799fa7c7948cc2f35a411523c12479">  448</a></span>    <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a22799fa7c7948cc2f35a411523c12479">m_opt_rexmit_on_raw</a>;</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span><span class="comment"></span> </div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span><span class="comment">    /**</span></div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span><span class="comment">     * Unused space reserved for future use, ensuring correct alignment of other fields and</span></div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span><span class="comment">     * headers.  Currently it must be always set to zero.  Since Low_lvl_packet has no need of a public</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span><span class="comment">     * data member like this, we keep it in here, as needed for Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span><span class="comment">     */</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a244e09a3f5318c25a120e3d29379adc8">  455</a></span>    <span class="keyword">const</span> uint16_t <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a244e09a3f5318c25a120e3d29379adc8">m_reserved2</a>;</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span> </div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span>    <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span><span class="comment"></span> </div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span><span class="comment">    /// Constructs a mostly-uninitialized object, except for the `const` member(s), if any.</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span><span class="comment"></span>    <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a7ae37084e00d375a749c3730f77e6072">Aux_raw_data</a>();</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>  };</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span> </div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span><span class="preprocessor">#pragma pack(pop)</span></div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span><span class="comment"></span> </div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span><span class="comment">   * A simple, unmodifiable data store that contains the properties unique to each packet type a/k/a</span></div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span><span class="comment">   * concrete sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span><span class="comment">   */</span></div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html">  469</a></span>  <span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html">Packet_type_info</a> <span class="comment">// Cannot use boost::noncopyable, as that disables direct member initialization.</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>  {<span class="comment"></span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span><span class="comment">    /// The type ID value, in serialized order, to be used in each serialization of all packets of this type.</span></div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html#a167901d7c0f96f240dd789027ad99dc5">  472</a></span><span class="comment"></span>    <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html#a167901d7c0f96f240dd789027ad99dc5">m_raw_type_id</a>;</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span><span class="comment"></span> </div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span><span class="comment">    /// The brief string representation of this packet type, suitable for Low_lvl_packet::type_id_to_str().</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html#a8dc054626823cb59a1570214349b8450">  475</a></span><span class="comment"></span>    <span class="keyword">const</span> std::string <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html#a8dc054626823cb59a1570214349b8450">m_type_id_str</a>;</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span>  };</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span> </div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span><span class="comment"></span> </div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span><span class="comment">   * Writes a brief representation of `typeid(*this)` -- i.e., the packet type (ACK, RST, etc.) --</span></div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span><span class="comment">   * to an output stream.  See also type_id_to_str().</span></div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span><span class="comment">   *</span></div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span><span class="comment">   * @note This is private, because it is meant only to be used in the implementation of</span></div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span><span class="comment">   *       the `ostream` manipulator #m_type_ostream_manip, which is public and to be used by users of this type.</span></div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span><span class="comment">   *        The output stream to use.  Normally I&#39;d make this a pointer, but this non-constant reference is</span></div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span><span class="comment">   *        fairly typical in STL and the world in general, for `ostream` in particular.</span></div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span><span class="comment">   * @return `os`.</span></div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span><span class="comment">   */</span></div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span>  std::ostream&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a720372b60ae7b7ee23c9f2d6775c7de1">type_to_ostream</a>(std::ostream&amp; os) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span><span class="comment"></span> </div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span><span class="comment">   * Helper that looks up the Packet_type_info::m_raw_type_id value for the given `typeid(p)`, where `p` refers</span></div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span><span class="comment">   * to an instance of a concrete sub-type of Low_lvl_packet.  Note that is returns a reference, and indeed the referred</span></div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span><span class="comment">   * to memory will remain valid and unmodified throughout the program&#39;s runtime.  Therefore, it can be used</span></div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span><span class="comment">   * for serialization without copying.</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span><span class="comment">   *</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span><span class="comment">   * ### Implementation note ###</span></div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span><span class="comment">   * It would be nice to make this `constexpr`, as then it can be used in `switch()` statement</span></div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span><span class="comment">   * conditionals.  Unfortunately, at least as of C++17, this is not possible with our current implementation:</span></div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span><span class="comment">   * #S_NATIVE_TYPE_ID_TO_PACKET_TYPE_INFO is an `unordered_map` (as of this writing), and that is not a &quot;literal&quot;</span></div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span><span class="comment">   * type (in other words, lookups in it are not done at compile time, even when for a human it would seem clearly</span></div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span><span class="comment">   * possible... iterators and such are involved, and that goes beyond what `constexpr` evaluation can do).</span></div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span><span class="comment">   *</span></div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span><span class="comment">   * @param type_id</span></div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span><span class="comment">   *        See type_id_to_str().</span></div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span><span class="comment">   * @return Reference to a constant area of memory.</span></div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span><span class="comment">   */</span></div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a>&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6b3de1eb7a337002440ecd1ab0ad058f">type_id_native_to_raw</a>(<span class="keyword">const</span> std::type_info&amp; type_id);</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span><span class="comment"></span> </div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span><span class="comment">   * `virtual` helper for create_from_raw_data_packet() that fills out the fields of `*this` that are *not*</span></div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span><span class="comment">   * in Low_lvl_packet but rather in the sub-type.</span></div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span><span class="comment">   *</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span><span class="comment">   * `*raw_buf` must represent the area of create_from_raw_data_packet()&#39;s `*raw_buf` argument immediately</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span><span class="comment">   * following the Common Header, which is the area deserialized into Low_lvl_packet proper.  Hence</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span><span class="comment">   * `*raw_buf` must point to and contain the length of the rest of that input buffer.  The present method</span></div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span><span class="comment">   * must then deserialize it into the sub-object&#39;s own fields.</span></div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span><span class="comment">   *</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span><span class="comment">   * @param raw_buf</span></div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span><span class="comment">   *        Pointer to immutable buffer just past the input raw packet data&#39;s Common Header area.</span></div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span><span class="comment">   *        Note that while the underlying area is immutable (hence the type #Const_buffer!),</span></div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span><span class="comment">   *        `*raw_buf` itself may be modified (i.e., the area to which it will refer on exit is undefined).</span></div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span><span class="comment">   *        See create_from_raw_data_packet().</span></div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span><span class="comment">   *        See create_from_raw_data_packet().  `raw_buf` must start somewhere within it and be</span></div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span><span class="comment">   *        sized to go exactly to its end.</span></div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span><span class="comment">   * @return `false` if create_from_raw_data_packet() should return `Ptr()` (error); `true` if</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span><span class="comment">   *         deserialization successful.</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span><span class="comment">   */</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a5c6a0e32bfe5616843746319533ca2c1">  533</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a5c6a0e32bfe5616843746319533ca2c1">deserialize_type_specific_data_from_raw_data_packet</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a>* raw_buf,</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span>                                                                   <span class="keywordtype">bool</span> prefer_no_move, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet) = 0;</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span> </div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span>  <span class="comment">// Constants.</span></div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span><span class="comment"></span> </div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span><span class="comment">   * Mapping from native `typeid()`, a/k/a packet type (for all possible packet types), to the set of properties of</span></div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span><span class="comment">   * that packet type.  The keys are every possible value of `type_index(typeid(p))`, where `p` is a reference</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span><span class="comment">   * to an instance of any concrete Low_lvl_packet sub-type.</span></div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span><span class="comment">   *</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span><span class="comment">   * ### Implementation note ###</span></div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span><span class="comment">   * An alternative way to implement this mechanism (as of this writing, raw type IDs and brief</span></div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span><span class="comment">   * string descriptions per packet type) is to use `virtual` liberally, combined with a `switch` if needed.  (Note,</span></div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span><span class="comment">   * also, that a way to index -- such as in an `unordered` container -- by</span></div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span><span class="comment">   * packet type is necessary elsewhere.  We use `type_index(typeid()))` now, but a [worse] alternative is to have</span></div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span><span class="comment">   * `virtual` type IDs returned for each Low_lvl_packet sub-type.)  I could explain</span></div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span><span class="comment">   * at length all the reasons why the chosen way is superior, but let me just give you the conclusion: I originally</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span><span class="comment">   * tried it the `virtual/switch` way.  Instead of the raw type IDs and</span></div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span><span class="comment">   * string descriptions being conveniently encapsulated in the present map (where there&#39;s little to no chance of</span></div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span><span class="comment">   * conflicting values), they were distributed across `virtual` implementations.  This was less maintainable; nor did</span></div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span><span class="comment">   * it improve OO style, since the raw type ID values (at least) were</span></div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span><span class="comment">   * still inter-dependent (were not allowed to conflict) in any case.</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span><span class="comment">   * The present solution does not pretend the actual contents of these values are of no interest to Low_lvl_packet</span></div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span><span class="comment">   * itself (as opposed to the sub-types), and in not having to pretend this, all related code is quite a bit more</span></div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span><span class="comment">   * compact and a bit more maintainable as well.</span></div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span><span class="comment">   */</span></div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a521afb86aaf334b871c9226ce503c508">  559</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> boost::unordered_map&lt;std::type_index, Packet_type_info&gt; <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a521afb86aaf334b871c9226ce503c508">S_NATIVE_TYPE_ID_TO_PACKET_TYPE_INFO</a>;</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span> </div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span><span class="comment"></span> </div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span><span class="comment">   * Auxilliary data area necessary for serialize_to_raw_data() to work.  This is explained in doc header</span></div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span><span class="comment">   * for Aux_raw_data.</span></div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span><span class="comment">   *</span></div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span><span class="comment">   * It is declared `mutable`, because the conceptual state contained within a Low_lvl_packet is expressed</span></div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span><span class="comment">   * via its public non-`const` data members.  #m_aux_raw_data is merely a helper data store for</span></div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span><span class="comment">   * the `const` method serialize_to_raw_data().  Since that method is `const`, this should be `mutable`,</span></div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span><span class="comment">   * like a performance cache of sorts, only not exactly.</span></div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span><span class="comment">   */</span></div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a1295f44e5a4ebdece11ed6d0eea0fbaa">  572</a></span>  <span class="keyword">mutable</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html">Aux_raw_data</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a1295f44e5a4ebdece11ed6d0eea0fbaa">m_aux_raw_data</a>;</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span>}; <span class="comment">// struct Low_lvl_packet</span></div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span><span class="comment"></span> </div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span><span class="comment">/**</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span><span class="comment"> * Internal `net_flow` `struct` that encapsulates the Flow-protocol low-level SYN packet.</span></div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span><span class="comment"> * See Low_lvl_packet doc header for information common to all low-level packets including this one.</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span><span class="comment"> *</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span><span class="comment"> * A SYN packet is sent by the actively connecting peer to a passively listening server socket.</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span><span class="comment"> * Thus a SYN arises from the Node that performs `Node::connect...()`.  In response, a Syn_ack_packet</span></div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span><span class="comment"> * is expected.</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno">  582</span><span class="comment"> */</span></div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__packet.html">  583</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Syn__packet.html">Syn_packet</a> : <span class="keyword">public</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">Low_lvl_packet</a></div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span>{</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span><span class="comment"></span> </div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span><span class="comment">   * The Initial Sequence Number (ISN) of the sequence number line that the sender of this SYN will be</span></div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span><span class="comment">   * using in `Data_packet`s over this connection, if it succeeds.  All bytes actually sent by the</span></div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span><span class="comment">   * SYN sender will start with this ISN + 1 and increment by 1 for each byte in the stream further.</span></div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span><span class="comment">   * A retransmission of a given datum starting with sequence number S will still start with sequence number</span></div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span><span class="comment">   * S.</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span><span class="comment">   */</span></div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__packet.html#af235e53d05d025b0808b2ee677c0cba4">  594</a></span>  <a class="code hl_class" href="classflow_1_1net__flow_1_1Sequence__number.html">Sequence_number</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__packet.html#af235e53d05d025b0808b2ee677c0cba4">m_init_seq_num</a>;</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span><span class="comment"></span> </div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span><span class="comment">   * Arbitrary serialized user-supplied metadata to send in SYN, where it can be deserialized by</span></div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span><span class="comment">   * the user on the other side.</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span><span class="comment">   *</span></div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span><span class="comment">   * @todo Possibly eliminate this, since NetFlow is reliable; the metadata can just be sent explicitly by the</span></div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span><span class="comment">   * user once the connection is established.  However, for now reliability is optional.</span></div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span><span class="comment">   */</span></div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__packet.html#abde26e74af2154fda517d6125353f305">  603</a></span>  <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__packet.html#abde26e74af2154fda517d6125353f305">m_serialized_metadata</a>;</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span> </div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_integer</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span>                  &amp;&amp; (!std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_signed),</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span>                <span class="stringliteral">&quot;Raw sequence numbers are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span><span class="comment"></span> </div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span><span class="comment">  /// In serialized packet, the type ID byte identifying this as a SYN packet.  Must not equal any other packet type&#39;s.</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__packet.html#a1f0628c2e2d6d58b881b379a95fde441">  611</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__packet.html#a1f0628c2e2d6d58b881b379a95fde441">S_RAW_TYPE_ID</a>;</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span> </div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span><span class="comment"></span> </div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span><span class="comment">   *</span></div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno">  619</span><span class="comment">   *        See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span><span class="comment">   * @return See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span><span class="comment">   */</span></div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__packet.html#af72461ac0c304cd5ea2bb3fca2b3a444">serialize_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span> </div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span><span class="comment"></span> </div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span><span class="comment">  /// Friend of Syn_packet: For access to private constructor `Syn_packet(Logger*)`.</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span><span class="comment"></span>  <span class="comment">// @todo Doxygen complains unless I make the above a Doxygen comment.  In other places it doesn&#39;t complain.  Fix...?</span></div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__packet.html#aca7129058be684c5584b70a90d1813ba">  629</a></span>  <span class="keyword">friend</span> boost::shared_ptr&lt;Syn_packet&gt; Low_lvl_packet::create_uninit_packet&lt;Syn_packet&gt;(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>*);</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span> </div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span><span class="comment"></span> </div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span><span class="comment">   * The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span><span class="comment">   *</span></div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span><span class="comment">   *        Logger to use subsequently.</span></div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span><span class="comment">   */</span></div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__packet.html#a943eb247f6c6a0de134e2d255feaf146">Syn_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span> </div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span><span class="comment"></span> </div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span><span class="comment">   *</span></div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span><span class="comment">   * @param verbose</span></div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span><span class="comment">   * @return `os`.</span></div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno">  651</span><span class="comment">   */</span></div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span>  std::ostream&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__packet.html#a11ded0bc8596fb4adc815c5322e7ad26">to_ostream</a>(std::ostream&amp; os, <span class="keywordtype">bool</span> verbose) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span><span class="comment"></span> </div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span><span class="comment">   *</span></div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span><span class="comment">   * @param raw_buf</span></div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span><span class="comment">   * @return See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span><span class="comment">   */</span></div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__packet.html#aee4a61d5e344959abc89ee83ae105c8a">deserialize_type_specific_data_from_raw_data_packet</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a>* raw_buf,</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span>                                                           <span class="keywordtype">bool</span> prefer_no_move, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet) <span class="keyword">override</span>;</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span>}; <span class="comment">// struct Syn_packet</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span><span class="comment"></span> </div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span><span class="comment">/**</span></div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span><span class="comment"> * Internal `net_flow` `struct` that encapsulates the Flow-protocol low-level SYN_ACK packet.</span></div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span><span class="comment"> * See Low_lvl_packet doc header for information common to all low-level packets including this one.</span></div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span><span class="comment"> *</span></div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span><span class="comment"> * A SYN_ACK packet is sent by the passively listening server socket in response to a valid received SYN.</span></div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span><span class="comment"> * Thus a SYN_ACK arises from the Node that performs Node::listen() and receives SYN.  In response, a</span></div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span><span class="comment"> * Syn_ack_ack_packet is expected to complete the 3-way handshake and establish a Peer_socket to Peer_socket</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span><span class="comment"> * connection.</span></div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span><span class="comment"> */</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__packet.html">  678</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Syn__ack__packet.html">Syn_ack_packet</a> : <span class="keyword">public</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">Low_lvl_packet</a></div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span>{</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span><span class="comment"></span> </div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span><span class="comment">   * Same meaning as Syn_packet::m_init_seq_num but applied to the essentially independent opposite</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span><span class="comment">   * traffic direction of the full-duplex connection being established.</span></div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span><span class="comment">   */</span></div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a0535131057e39d7d9092156fa674b9d4">  686</a></span>  <a class="code hl_class" href="classflow_1_1net__flow_1_1Sequence__number.html">Sequence_number</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a0535131057e39d7d9092156fa674b9d4">m_init_seq_num</a>;</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span> </div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span><span class="preprocessor">#pragma pack(push, 1)</span><span class="comment"></span></div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span><span class="comment">  /// Packed group affected by `#pragma pack`.</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span><span class="comment"></span>  <span class="keyword">struct</span></div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span>  {<span class="comment"></span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span><span class="comment">    /**</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span><span class="comment">     * Random security token used during SYN_ACK-SYN_ACK_ACK.  For a given connection handshake, the SYN_ACK_ACK</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span><span class="comment">     * receiver ensures that `Syn_ack_ack_packet` `m_security_token` it receives is equal to the original</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="comment">     * one it had sent (this #m_security_token here).</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span><span class="comment">     */</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a46bb776a13c77d7109469c0c29565a30">  697</a></span>    <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a872044469cfa05a3abf3f9ab1c7cf03b">security_token_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a46bb776a13c77d7109469c0c29565a30">m_security_token</a>;</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span><span class="comment"></span> </div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span><span class="comment">    /**</span></div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span><span class="comment">     * Number of DATA payload bytes the sender of this packet would accept into its Receive buffer,</span></div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span><span class="comment">     * without dropping, at the moment this packet was generated to send.  This information is</span></div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span><span class="comment">     * piggybacked into ACK (and SYN_ACK/SYN_ACK_ACK) packets.</span></div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span><span class="comment">     *</span></div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span><span class="comment">     * @todo We could be similar to TCP by opportunistically sending rcv_wnd in other packet types,</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span><span class="comment">     * namely Data_packet.  However this would only help in connections with heavy 2-way traffic.</span></div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span><span class="comment">     * Personally I would then prefer to create a new packet type instead, Rcv_wnd_packet, and also</span></div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span><span class="comment">     * implement some generalized &quot;packet combo&quot; scheme which would allow to piggy-back arbitrary</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span><span class="comment">     * packet types together into a single packet; and then we&#39;d dissociate</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span><span class="comment">     * ACK/SYN_ACK/SYN_ACK_ACK from rcv_wnd.</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno">  710</span><span class="comment">     */</span></div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a1ed3bdee2d19c2adaaf00fda9b5a7ca8">  711</a></span>    <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a01ff17bec742d9e363aea2ecd23f2f72">rcv_wnd_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a1ed3bdee2d19c2adaaf00fda9b5a7ca8">m_rcv_wnd</a>;</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#aaf2fa9221da49c413441aa8fec93ce91">  712</a></span>  } <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#aaf2fa9221da49c413441aa8fec93ce91">m_packed</a>;</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span><span class="preprocessor">#pragma pack(pop)</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span> </div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_integer</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span>                  &amp;&amp; (!std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_signed),</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span>                <span class="stringliteral">&quot;Raw sequence numbers are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;security_token_t&gt;::is_integer</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span>                  &amp;&amp; (!std::numeric_limits&lt;security_token_t&gt;::is_signed),</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span>                <span class="stringliteral">&quot;Security tokens are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;rcv_wnd_t&gt;::is_integer</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span>                  &amp;&amp; (!std::numeric_limits&lt;rcv_wnd_t&gt;::is_signed),</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span>                <span class="stringliteral">&quot;rcv_wnd values are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span><span class="comment"></span> </div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span><span class="comment">  /// In serialized packet, the type ID byte identifying this as a SYN_ACK.  Must not equal any other packet type&#39;s.</span></div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#ab6db0fded81c7002f0bd00e9388b09bd">  727</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#ab6db0fded81c7002f0bd00e9388b09bd">S_RAW_TYPE_ID</a>;</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span> </div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span><span class="comment"></span> </div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span><span class="comment">   *</span></div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span><span class="comment">   *        See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span><span class="comment">   * @return See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span><span class="comment">   */</span></div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a98fae8deebcd22c8397f2585de18ce9d">serialize_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span> </div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span><span class="comment"></span> </div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span><span class="comment">  /// Friend of Syn_ack_packet: For access to private constructor `Syn_ack_packet(Logger*)`.</span></div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span><span class="comment"></span>  <span class="comment">// @todo Doxygen complains unless I make the above a Doxygen comment.  In other places it doesn&#39;t complain.  Fix...?</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#ad0df496e6804311013b1eb0ffe287b3d">  745</a></span>  <span class="keyword">friend</span> boost::shared_ptr&lt;Syn_ack_packet&gt; Low_lvl_packet::create_uninit_packet&lt;Syn_ack_packet&gt;(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>*);</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span> </div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span><span class="comment"></span> </div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span><span class="comment">   * The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span><span class="comment">   *</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span><span class="comment">   *        Logger to use subsequently.</span></div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno">  754</span><span class="comment">   */</span></div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a439f09a3ae4d1a5125781e220e29c39e">Syn_ack_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span> </div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span><span class="comment"></span> </div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span><span class="comment">   *</span></div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span><span class="comment">   * @param verbose</span></div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span><span class="comment">   * @return `os`.</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span><span class="comment">   */</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span>  std::ostream&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a9c98a61096d86196c073a232e432d03b">to_ostream</a>(std::ostream&amp; os, <span class="keywordtype">bool</span> verbose) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span><span class="comment"></span> </div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span><span class="comment">   *</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span><span class="comment">   * @param raw_buf</span></div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span><span class="comment">   * @return See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span><span class="comment">   */</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a1ce651745da7f488ec0bcf3d4f3467a9">deserialize_type_specific_data_from_raw_data_packet</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a>* raw_buf,</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span>                                                           <span class="keywordtype">bool</span> prefer_no_move, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet) <span class="keyword">override</span>;</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span>};</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span><span class="comment"></span> </div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span><span class="comment">/**</span></div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span><span class="comment"> * Internal `net_flow` `struct` that encapsulates the Flow-protocol low-level SYN_ACK_ACK packet.</span></div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span><span class="comment"> * See Low_lvl_packet doc header for information common to all low-level packets including this one.</span></div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span><span class="comment"> *</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span><span class="comment"> * A SYN_ACK_ACK packet is sent by the original SYN sender in response to a valid received SYN_ACK,</span></div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span><span class="comment"> * completing the 3-way handshake and establishing a Peer_socket to Peer_socket connection.</span></div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span><span class="comment"> */</span></div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html">  792</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html">Syn_ack_ack_packet</a> : <span class="keyword">public</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">Low_lvl_packet</a></div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span>{</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno">  794</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span> </div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span><span class="preprocessor">#pragma pack(push, 1)</span><span class="comment"></span></div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span><span class="comment">  /// Packed group affected by `#pragma pack`.</span></div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span><span class="comment"></span>  <span class="keyword">struct</span></div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span>  {<span class="comment"></span></div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span><span class="comment">    /**</span></div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno">  801</span><span class="comment">     * This must equal `Syn_ack_packet` `m_security_token` received in the packet to which `*this` is</span></div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span><span class="comment">     * replying.  The other side will only proceed with the connection if the two are equal.</span></div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span><span class="comment">     */</span></div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#ab2537625fa282f302e586dee1c24cd19">  804</a></span>    <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a872044469cfa05a3abf3f9ab1c7cf03b">security_token_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#ab2537625fa282f302e586dee1c24cd19">m_security_token</a>;</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span><span class="comment"></span> </div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span><span class="comment">    /**</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span><span class="comment">     * Same meaning as in `Syn_ack_packet` but applied to the essentially independent opposite</span></div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span><span class="comment">     * traffic direction of the full-duplex connection being established.</span></div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span><span class="comment">     */</span></div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a3a3a3d676ec71eee0d2daa56a3b73403">  810</a></span>    <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a01ff17bec742d9e363aea2ecd23f2f72">rcv_wnd_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a3a3a3d676ec71eee0d2daa56a3b73403">m_rcv_wnd</a>;</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a1a0bad5bc4e9c966709f7bc8a2469bf6">  811</a></span>  } <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a1a0bad5bc4e9c966709f7bc8a2469bf6">m_packed</a>;</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span><span class="preprocessor">#pragma pack(pop)</span></div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno">  813</span> </div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno">  814</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno">  815</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;security_token_t&gt;::is_integer</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span>                  &amp;&amp; (!std::numeric_limits&lt;security_token_t&gt;::is_signed),</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span>                <span class="stringliteral">&quot;Security tokens are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;rcv_wnd_t&gt;::is_integer</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span>                  &amp;&amp; (!std::numeric_limits&lt;rcv_wnd_t&gt;::is_signed),</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span>                <span class="stringliteral">&quot;rcv_wnd values are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno">  821</span><span class="comment"></span> </div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno">  822</span><span class="comment">  /// In serialized packet, the type ID byte identifying this as a SYN_ACK_ACK.  Must not equal any other packet type&#39;s.</span></div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#ade7cf2a204f400633f079bed7b4b4972">  823</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#ade7cf2a204f400633f079bed7b4b4972">S_RAW_TYPE_ID</a>;</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span> </div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno">  825</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span><span class="comment"></span> </div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno">  827</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno">  828</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span><span class="comment">   *</span></div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno">  831</span><span class="comment">   *        See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span><span class="comment">   * @return See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span><span class="comment">   */</span></div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno">  834</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a817e22c18b67db0e2e4794b962e4365d">serialize_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno">  835</span> </div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno">  836</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span><span class="comment"></span> </div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span><span class="comment">  /// Friend of Syn_ack_ack_packet: For access to private constructor `Syn_ack_ack_packet(Logger*)`.</span></div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno">  840</span><span class="comment"></span>  <span class="comment">// @todo Doxygen complains unless I make the above a Doxygen comment.  In other places it doesn&#39;t complain.  Fix...?</span></div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a14d8cfa29392fb69ce6b08306e78d1fd">  841</a></span>  <span class="keyword">friend</span> boost::shared_ptr&lt;Syn_ack_ack_packet&gt; Low_lvl_packet::create_uninit_packet&lt;Syn_ack_ack_packet&gt;(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>*);</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno">  842</span> </div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno">  844</span><span class="comment"></span> </div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno">  845</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span><span class="comment">   * The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span><span class="comment">   *</span></div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno">  849</span><span class="comment">   *        Logger to use subsequently.</span></div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span><span class="comment">   */</span></div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno">  851</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a86707d5efb4b1b5ad056a4255976e262">Syn_ack_ack_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno">  852</span> </div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span><span class="comment"></span> </div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno">  855</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span><span class="comment">   *</span></div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno">  858</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span><span class="comment">   * @param verbose</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno">  861</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span><span class="comment">   * @return `os`.</span></div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span><span class="comment">   */</span></div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span>  std::ostream&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a0f2665713bcedc20db1365412630ff6f">to_ostream</a>(std::ostream&amp; os, <span class="keywordtype">bool</span> verbose) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span><span class="comment"></span> </div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno">  866</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno">  867</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span><span class="comment">   *</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span><span class="comment">   * @param raw_buf</span></div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno">  874</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span><span class="comment">   * @return See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span><span class="comment">   */</span></div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a15bb98c2c3c00dc2c2db7f76a932d65c">deserialize_type_specific_data_from_raw_data_packet</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a>* raw_buf,</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno">  878</span>                                                           <span class="keywordtype">bool</span> prefer_no_move, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet) <span class="keyword">override</span>;</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno">  879</span>}; <span class="comment">// struct Syn_ack_ack_packet</span></div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span><span class="comment"></span> </div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span><span class="comment">/**</span></div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno">  882</span><span class="comment"> * Internal `net_flow` `struct` that encapsulates the Flow-protocol low-level DATA packet.</span></div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span><span class="comment"> * See Low_lvl_packet doc header for information common to all low-level packets including this one.</span></div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span><span class="comment"> *</span></div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno">  885</span><span class="comment"> * Each DATA packet contains actual data payload packetized from the application-provided stream</span></div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno">  886</span><span class="comment"> * of bytes.  It is identified by the sequence number (encoded in this object) of the first</span></div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno">  887</span><span class="comment"> * byte of that payload.  An individual acknowledgment inside an Ack_packet refers to the Data_packet</span></div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span><span class="comment"> * by that first sequence number.  If Low_lvl_packet::m_opt_rexmit_on is `true`, then #m_rexmit_id</span></div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span><span class="comment"> * identifies which attempt at sending the payload with this sequence number and payload this</span></div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno">  890</span><span class="comment"> * packet represents: 0 is 1st attempt, 1 is 1st retry, 2 is 2nd retry, etc.  If that option is off,</span></div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno">  891</span><span class="comment"> * then a lost packet is never retransmitted; and therefore #m_rexmit_id is always 0.</span></div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno">  892</span><span class="comment"> */</span></div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html">  893</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Data__packet.html">Data_packet</a> : <span class="keyword">public</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">Low_lvl_packet</a></div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span>{</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span><span class="comment"></span> </div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno">  897</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno">  898</span><span class="comment">   * Type used to store the retransmission count in DATA and ACK packets.</span></div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span><span class="comment">   *</span></div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno">  900</span><span class="comment">   * Why 8 bits?  This handles up 255 retransmissions, which is long after we&#39;d kill the connection</span></div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno">  901</span><span class="comment">   * anyway.</span></div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno">  902</span><span class="comment">   */</span></div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html#abba220658ada68bae04c9c2ebd06f72c">  903</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a11e7750d22415a381e23112062f7ca74">rexmit_id_t</a> = <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a>;</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno">  904</span> </div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno">  905</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno">  906</span><span class="comment"></span> </div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno">  907</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno">  908</span><span class="comment">   * The sequence number of the first byte in the payload; i.e., of `m_data.front()`, a/k/a `m_data[0]`.</span></div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno">  909</span><span class="comment">   * Note that #m_data cannot be empty, so #m_seq_num is always meaningful.</span></div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno">  910</span><span class="comment">   */</span></div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html#a94d817529e94ac88ee2cea6f3dd1badb">  911</a></span>  <a class="code hl_class" href="classflow_1_1net__flow_1_1Sequence__number.html">Sequence_number</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Data__packet.html#a94d817529e94ac88ee2cea6f3dd1badb">m_seq_num</a>;</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno">  912</span><span class="comment"></span> </div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno">  913</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno">  914</span><span class="comment">   * Retransmit counter of the DATA packet being sent.  Identifies which attempt we are acknowledging</span></div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno">  915</span><span class="comment">   * (0 = initial, 1 = first retransmit, 2 = second retransmit, ...).  Always 0 if `!m_opt_rexmit_on`.</span></div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno">  916</span><span class="comment">   */</span></div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html#ac149f87b8915213857c707b0f3562ef0">  917</a></span>  <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a11e7750d22415a381e23112062f7ca74">rexmit_id_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Data__packet.html#ac149f87b8915213857c707b0f3562ef0">m_rexmit_id</a>;</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno">  918</span><span class="comment"></span> </div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno">  919</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno">  920</span><span class="comment">   * This is the serialized version of `m_data.size()` (see #m_data).  We send this value, even though it could</span></div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno">  921</span><span class="comment">   * be figured out from the overall serialized size, to ensure integrity (see the deserialization logic for details).</span></div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno">  922</span><span class="comment">   * This here is set to `m_data.size()`, when Low_lvl_packet::serialize_to_raw_data() needs to</span></div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno">  923</span><span class="comment">   * serialize that value.  Outside serialization `m_data.size()` is used directly, and this</span></div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno">  924</span><span class="comment">   * value is meaningless.</span></div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno">  925</span><span class="comment">   */</span></div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html#a07cf37a89d947f40354a79a885407567">  926</a></span>  <span class="keyword">mutable</span> uint16_t <a class="code hl_variable" href="structflow_1_1net__flow_1_1Data__packet.html#a07cf37a89d947f40354a79a885407567">m_data_size_raw</a>;</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno">  927</span><span class="comment"></span> </div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno">  928</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno">  929</span><span class="comment">   * The payload.  Cannot be `empty()`.</span></div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno">  930</span><span class="comment">   *</span></div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno">  931</span><span class="comment">   * As of this writing there is an important (for performance) subtlety about how this is originally filled in</span></div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno">  932</span><span class="comment">   * when deserializing a wire-arrived packet.  See Data_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno">  933</span><span class="comment">   */</span></div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html#ad76ae289cd958d62bb5cd29b9f9e894d">  934</a></span>  <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Data__packet.html#ad76ae289cd958d62bb5cd29b9f9e894d">m_data</a>;</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno">  935</span> </div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno">  936</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno">  937</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_integer</div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno">  938</span>                  &amp;&amp; (!std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_signed),</div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno">  939</span>                <span class="stringliteral">&quot;Raw sequence numbers are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno">  940</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;rexmit_id_t&gt;::is_integer</div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno">  941</span>                  &amp;&amp; (!std::numeric_limits&lt;rexmit_id_t&gt;::is_signed),</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno">  942</span>                <span class="stringliteral">&quot;Retransmission IDs are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno">  943</span><span class="comment"></span> </div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno">  944</span><span class="comment">  /// In serialized packet, the type ID byte identifying this as a DATA packet.  Must not equal any other packet type&#39;s.</span></div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html#a463336b35dde27c250b477ca35adb7d4">  945</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Data__packet.html#a463336b35dde27c250b477ca35adb7d4">S_RAW_TYPE_ID</a>;</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno">  946</span> </div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno">  947</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno">  948</span><span class="comment"></span> </div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno">  949</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno">  950</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno">  951</span><span class="comment">   *</span></div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno">  952</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno">  953</span><span class="comment">   *        See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno">  954</span><span class="comment">   * @return See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno">  955</span><span class="comment">   */</span></div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno">  956</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Data__packet.html#add582f24dd9442f987f2c458e4b5d3d7">serialize_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno">  957</span> </div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno">  958</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno">  959</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno">  960</span><span class="comment"></span> </div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno">  961</span><span class="comment">  /// Friend of Data_packet: For access to private constructor `Data_packet(Logger*)`.</span></div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno">  962</span><span class="comment"></span>  <span class="comment">// @todo Doxygen complains unless I make the above a Doxygen comment.  In other places it doesn&#39;t complain.  Fix...?</span></div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Data__packet.html#a94c3ee43fa396c27a95ab54830700d1a">  963</a></span>  <span class="keyword">friend</span> boost::shared_ptr&lt;Data_packet&gt; Low_lvl_packet::create_uninit_packet&lt;Data_packet&gt;(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>*);</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno">  964</span> </div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno">  965</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno">  966</span><span class="comment"></span> </div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno">  967</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno">  968</span><span class="comment">   * The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno">  969</span><span class="comment">   *</span></div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno">  970</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno">  971</span><span class="comment">   *        Logger to use subsequently.</span></div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno">  972</span><span class="comment">   */</span></div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno">  973</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Data__packet.html#a0c5cb656fd8fd513d66a349285558900">Data_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno">  974</span> </div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno">  975</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno">  976</span><span class="comment"></span> </div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno">  977</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno">  978</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno">  979</span><span class="comment">   *</span></div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno">  980</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno">  981</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno">  982</span><span class="comment">   * @param verbose</span></div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno">  983</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno">  984</span><span class="comment">   * @return `os`.</span></div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno">  985</span><span class="comment">   */</span></div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno">  986</span>  std::ostream&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Data__packet.html#a0bfa19b23164c8189c05d3c2417cf23b">to_ostream</a>(std::ostream&amp; os, <span class="keywordtype">bool</span> verbose) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno">  987</span><span class="comment"></span> </div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno">  988</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno">  989</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno">  990</span><span class="comment">   *</span></div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno">  991</span><span class="comment">   * @param raw_buf</span></div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno">  992</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno">  993</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno">  994</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno">  995</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno">  996</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno">  997</span><span class="comment">   * @return See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno">  998</span><span class="comment">   */</span></div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno">  999</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Data__packet.html#ac2a390c4cb7abfeec7c658c866dbfc06">deserialize_type_specific_data_from_raw_data_packet</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a>* raw_buf,</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span>                                                           <span class="keywordtype">bool</span> prefer_no_move, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet) <span class="keyword">override</span>;</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span>}; <span class="comment">// struct Data_packet</span></div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span><span class="comment"></span> </div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span><span class="comment">/**</span></div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span><span class="comment"> * Internal `net_flow` `struct` that encapsulates the Flow-protocol low-level ACK packet.</span></div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span><span class="comment"> * See Low_lvl_packet doc header for information common to all low-level packets including this one.</span></div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span><span class="comment"> *</span></div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span><span class="comment"> * Each ACK packet encapsulates 0 or more individual acknowledgments, each acknowledging receipt of</span></div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span><span class="comment"> * a specific, distinct Data_packaet; and the current rcv_wnd (receive window state) on the ACK sender&#39;s</span></div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span><span class="comment"> * side.  The latter datum is always present.  If individual acks are present, then the rcv_wnd advertising</span></div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span><span class="comment"> * is merely opportunistic.  If NO individual acks are present, then the rcv_wnd advertising is intentional</span></div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span><span class="comment"> * for its own sake.  The algorithm for the latter is discussed elsewhere.</span></div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span><span class="comment"> *</span></div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span><span class="comment"> * The mechanics of individual acks are further explored in the doc header for Ack_packet::Individual_ack</span></div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span><span class="comment"> * nested `struct`.</span></div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span><span class="comment"> *</span></div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span><span class="comment"> * @todo Conceivably, since Ack_packet actually stores 1+ acknowledgments, it should become Acks_packet, of</span></div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span><span class="comment"> * type ACKS (not ACK).  Many comments and log messages would become clearer, as no one would assume an individual</span></div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span><span class="comment"> * packet&#39;s acknowledgment when reading &quot;an ACK&quot; or similar phrase.</span></div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span><span class="comment"> */</span></div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html"> 1020</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet.html">Ack_packet</a> : <span class="keyword">public</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">Low_lvl_packet</a></div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span>{</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span><span class="comment"></span> </div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span><span class="comment">   * Type used to store the ACK delay for a given individual acknowledged packet.  The value</span></div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span><span class="comment">   * specifies the number of multiples of `Ack_delay_time_unit(1)` comprising a packet&#39;s ACK delay.</span></div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span><span class="comment">   *</span></div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span><span class="comment">   * An earlier version of `net_flow` used the unit milliseconds and the encoding type uint16_t.  The</span></div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span><span class="comment">   * reasoning was that this allowed a maximum ACK delay of ~65 sec which should be plenty; and that</span></div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span><span class="comment">   * the 1-millisecond finegrainedness was acceptable.  However when implementing queue delay-based</span></div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span><span class="comment">   * congestion control (like FAST or Vegas) we realized it is important for RTTs (which use the ACK</span></div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span><span class="comment">   * delay value) to be quite precise (microsecond level or so).  Therefore, to be totally safe, we</span></div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span><span class="comment">   * choose to use the same units as #Fine_duration, which is how we compute all time periods.  As</span></div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span><span class="comment">   * for the the encoding width, we use 64 bits just in case.</span></div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span><span class="comment">   *</span></div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span><span class="comment">   * @todo Reconsider the encoding width.  If `Ack_delay_time_unit(1)` is a nanosecond, then 32 bits</span></div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span><span class="comment">   * would support a maximum delay of ~4.1 seconds which is likely fine for most real-world</span></div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span><span class="comment">   * scenarios.  This would reduce the size of ACK packets quite a bit.</span></div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span><span class="comment">   */</span></div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#a374da5eef60c7d8a4085b41cf7b2adfe"> 1040</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Ack__packet.html#a374da5eef60c7d8a4085b41cf7b2adfe">ack_delay_t</a> = uint64_t;</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span><span class="comment"></span> </div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span><span class="comment">  /// `Ack_delay_time_unit(1)` is the duration corresponding to the #ack_delay_t value 1; and proportionally further.</span></div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#abd3bc7f9e9195bf1b4aca2cad881646c"> 1043</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Ack__packet.html#abd3bc7f9e9195bf1b4aca2cad881646c">Ack_delay_time_unit</a> = <a class="code hl_typedef" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a>;</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> </div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span>  <span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html">Individual_ack</a>;</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span>  <span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html">Individual_ack_rexmit_off</a>;</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span>  <span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html">Individual_ack_rexmit_on</a>;</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> </div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span><span class="comment"></span> </div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span><span class="comment">  /// Current receive window (remaining Receive buffer size) of the ACK sender.</span></div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#a56b2560b87540a3cf5c7bba9e9666641"> 1052</a></span><span class="comment"></span>  <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a01ff17bec742d9e363aea2ecd23f2f72">rcv_wnd_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet.html#a56b2560b87540a3cf5c7bba9e9666641">m_rcv_wnd</a>;</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span><span class="comment"></span> </div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span><span class="comment">   * This is the serialized version of `m_rcv_acked_packets_rexmit_{on|off}_out.size()` and</span></div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span><span class="comment">   * `m_rcv_acked_packets.size()` (whichever is applicable in context).</span></div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span><span class="comment">   * We send this value, even though it could be figured out from the overall serialized</span></div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span><span class="comment">   * size, to ensure integrity (see the deserialization logic for details).</span></div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span><span class="comment">   * This here is set to `size()`, when Low_lvl_packet::serialize_to_raw_data() needs to</span></div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span><span class="comment">   * serialize that value.  Outside serialization `size()` is used directly, and this</span></div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span><span class="comment">   * value is meaningless.</span></div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span><span class="comment">   */</span></div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#aae3806ebf76e628494fd6f7681c01409"> 1063</a></span>  <span class="keyword">mutable</span> uint16_t <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet.html#aae3806ebf76e628494fd6f7681c01409">m_rcv_acked_packets_rexmit_out_size</a>;</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> </div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;rcv_wnd_t&gt;::is_integer</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span>                  &amp;&amp; (!std::numeric_limits&lt;rcv_wnd_t&gt;::is_signed),</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span>                <span class="stringliteral">&quot;rcv_wnd values are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span><span class="comment"></span> </div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span><span class="comment">   * List of *incoming* (post-deserialization of ACK) acknowledgments of DATA packets,</span></div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span><span class="comment">   * each identified by its first datum&#39;s sequence number as</span></div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span><span class="comment">   * provided by the other side and ordered in the chronological order they were received.</span></div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span><span class="comment">   * This may also be empty, in which case the containing ACK acknowledges no DATA packets but only</span></div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span><span class="comment">   * advertises the current receive window size (#m_rcv_wnd).  (Note that it advertises it if</span></div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span><span class="comment">   * #m_rcv_acked_packets is NOT empty as well.)</span></div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span><span class="comment">   *</span></div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span><span class="comment">   * This is used if and only if this Ack_packet is incoming.  See #m_rcv_acked_packets_rexmit_on_out</span></div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span><span class="comment">   * and #m_rcv_acked_packets_rexmit_off_out for the outgoing scenario.</span></div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span><span class="comment">   *</span></div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span><span class="comment">   * Unlike vanilla TCP from RFC 793, which features cumulative acknowledgment (wherein only the</span></div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span><span class="comment">   * latest received segment BEFORE any unreceived gap is acknowledged, thus just one total number</span></div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span><span class="comment">   * in the ACK), and unlike later enhanced TCPs, which feature both cumulative acknowledgement</span></div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span><span class="comment">   * and individual ACKs (Selective ACKs), we use something similar to Selective ACKs only.  That</span></div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span><span class="comment">   * is, we only acknowledge each packet individually (though we combine many such little</span></div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span><span class="comment">   * acknowledgments into one packet via delayed ACKs).  Moreover, we do not piggy-back ACK info</span></div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span><span class="comment">   * onto DATA packets; ACK is its own type.</span></div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span><span class="comment">   *</span></div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span><span class="comment">   * Rationale for using SACKs only: Selective ACKs help greatly in giving accurate congestion</span></div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span><span class="comment">   * control data (e.g., ACK delay per packet, dropped packets) and remove complex ambiguities of</span></div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span><span class="comment">   * trying to interpret cumulative ACKs for that purpose.  For retransmits, when enabled, Selective</span></div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span><span class="comment">   * ACKs also greatly simplify the design choices (since we know exactly what they don&#39;t have</span></div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span><span class="comment">   * [assuming no lost ACKs], we can send exactly what they want and no more).</span></div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span><span class="comment">   *</span></div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span><span class="comment">   * Rationale for keeping ACK and DATA separate: This is less clear-cut.  It is easier to think</span></div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span><span class="comment">   * about, certainly, as the two types of traffic aren&#39;t really logically related in a full-duplex</span></div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span><span class="comment">   * connection.  On the other hand it increases overhead.  On the third hand that disadvantage is</span></div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span><span class="comment">   * not a big deal assuming mostly unidirectional traffic flow (which is typical), since most of</span></div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span><span class="comment">   * the time the ACKs would be data-less anyway in that situation.  Delayed ACKs also help combat</span></div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span><span class="comment">   * overhead -- somewhat.</span></div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span><span class="comment">   *</span></div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span><span class="comment">   * Rationale for delayed ACKs a/k/a accumulating more than 1 acknowledgment into an ACK: Combat</span></div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span><span class="comment">   * overhead which can be a big deal for high bitrate streaming traffic for example (research</span></div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span><span class="comment">   * shows ACK flow can be 10% of data flow in the other direction).  The cost is that the other</span></div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span><span class="comment">   * side gets somewhat delayed congestion control information, but the delay can be tuned.  In</span></div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span><span class="comment">   * TCP implementations delayed ACKs appear to be universal since a long time ago.</span></div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span><span class="comment">   *</span></div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span><span class="comment">   * Any two packets represented by these `Individual_ack`s may be duplicates of each other (same</span></div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span><span class="comment">   * Sequence_number, possibly different delay values).  It&#39;s up to the sender (receiver of ACK)</span></div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span><span class="comment">   * to sort it out.  However, again, they MUST be ordered chronologicaly based on the time when</span></div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span><span class="comment">   * they were received; from earliest to latest.</span></div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span><span class="comment">   *</span></div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span><span class="comment">   * Storing shared pointers to avoid copying of `struct`s (however small) during internal</span></div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span><span class="comment">   * reshuffling; shared instead of raw pointers to not worry about `delete`.</span></div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span><span class="comment">   */</span></div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#a232e22e04614ead19fa4531a89838015"> 1116</a></span>  std::vector&lt;boost::shared_ptr&lt;Individual_ack&gt;&gt; <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet.html#a232e22e04614ead19fa4531a89838015">m_rcv_acked_packets</a>;</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span><span class="comment"></span> </div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span><span class="comment">   * Equivalent of #m_rcv_acked_packets but used for *outgoing* (pre-serialization of ACK) acknowledgments</span></div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span><span class="comment">   * and only if retransmission is disabled.  See notes in Individual_ack_rexmit_off doc header about how</span></div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span><span class="comment">   * this is used for efficient serialization of Ack_packet.</span></div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span><span class="comment">   *</span></div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span><span class="comment">   * This is used if and only if Ack_packet is outgoing, and retransmission is disabled.</span></div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span><span class="comment">   * See #m_rcv_acked_packets for the incoming scenario.</span></div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span><span class="comment">   */</span></div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#aebad844e9061da02db8f168374869f9e"> 1126</a></span>  std::vector&lt;Individual_ack_rexmit_off&gt; <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet.html#aebad844e9061da02db8f168374869f9e">m_rcv_acked_packets_rexmit_off_out</a>;</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span><span class="comment"></span> </div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span><span class="comment">  /// Equivalent of #m_rcv_acked_packets_rexmit_off_out but for retransmission enabled.</span></div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#abfcb97c4f3f8552c619b6aba07674063"> 1129</a></span><span class="comment"></span>  std::vector&lt;Individual_ack_rexmit_on&gt; <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet.html#abfcb97c4f3f8552c619b6aba07674063">m_rcv_acked_packets_rexmit_on_out</a>;</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span><span class="comment"></span> </div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span><span class="comment">  /// In serialized packet, the type ID byte identifying this as an ACK packet.  Must not equal any other packet type&#39;s.</span></div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#aa57707612db973cb99a12ef81f091c38"> 1132</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet.html#aa57707612db973cb99a12ef81f091c38">S_RAW_TYPE_ID</a>;</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> </div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span><span class="comment"></span> </div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span><span class="comment">   *</span></div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span><span class="comment">   *        See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span><span class="comment">   * @return See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span><span class="comment">   */</span></div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Ack__packet.html#a878162c8ec16ab4ee1b3ea4bbe4b51c0">serialize_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> </div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span><span class="comment"></span> </div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span><span class="comment">  /// Friend of Ack_packet: For access to private constructor `Ack_packet(Logger*)`.</span></div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span><span class="comment"></span>  <span class="comment">// @todo Doxygen complains unless I make the above a Doxygen comment.  In other places it doesn&#39;t complain.  Fix...?</span></div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet.html#a88d164cbb8a4166aedc4afcca51048e8"> 1150</a></span>  <span class="keyword">friend</span> boost::shared_ptr&lt;Ack_packet&gt; Low_lvl_packet::create_uninit_packet&lt;Ack_packet&gt;(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>*);</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> </div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span><span class="comment"></span> </div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span><span class="comment">   * The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span><span class="comment">   *</span></div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span><span class="comment">   *        Logger to use subsequently.</span></div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span><span class="comment">   */</span></div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Ack__packet.html#acef61dca75aa49d653acdfd96b065723">Ack_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> </div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span><span class="comment"></span> </div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span><span class="comment">   *</span></div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span><span class="comment">   * @param verbose</span></div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span><span class="comment">   *        See Low_lvl_packet::to_ostream().</span></div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span><span class="comment">   * @return `os`.</span></div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span><span class="comment">   */</span></div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span>  std::ostream&amp; <a class="code hl_function" href="structflow_1_1net__flow_1_1Ack__packet.html#a49659e0e672d324ad17e2f4240604b49">to_ostream</a>(std::ostream&amp; os, <span class="keywordtype">bool</span> verbose) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span><span class="comment"></span> </div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span><span class="comment">   *</span></div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span><span class="comment">   * @param raw_buf</span></div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span><span class="comment">   * @return See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span><span class="comment">   */</span></div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Ack__packet.html#a5af95ad4de8253b613d55a99d41cb430">deserialize_type_specific_data_from_raw_data_packet</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a>* raw_buf,</div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span>                                                           <span class="keywordtype">bool</span> prefer_no_move, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet) <span class="keyword">override</span>;</div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span>}; <span class="comment">// struct Ack_packet</span></div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span><span class="comment"></span> </div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span><span class="comment">/**</span></div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span><span class="comment"> * Specifies the *incoming* (post-deserialization) acknowledgment of a single received Data_packet.</span></div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span><span class="comment"> * It is not copyable, and moving them around by smart Individual_ack::Ptr is encouraged.</span></div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span><span class="comment"> * Construct this by direct member initialization.</span></div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span><span class="comment"> */</span></div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html"> 1195</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html">Ack_packet::Individual_ack</a></div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span>  <span class="comment">// Cannot use boost::noncopyable or Shared_ptr_alias_holder, because that turns off direct initialization.</span></div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span>{</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span><span class="comment"></span> </div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span><span class="comment">  /// Short-hand for ref-counted pointer to mutable objects of this class.</span></div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#abbd41e30089125f67667b39f5756c275"> 1201</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#abbd41e30089125f67667b39f5756c275">Ptr</a> = boost::shared_ptr&lt;Individual_ack&gt;;</div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span><span class="comment"></span> </div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span><span class="comment">  /// Short-hand for ref-counted pointer to immutable objects of this class.</span></div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a55bebcb04b4cc192e38023e58bfd761c"> 1204</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a55bebcb04b4cc192e38023e58bfd761c">Const_ptr</a> = boost::shared_ptr&lt;const Individual_ack&gt;;</div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> </div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span><span class="comment"></span> </div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span><span class="comment">   * Sequence number of first datum in packet that we acknowledge.</span></div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span><span class="comment">   * This is non-`const` for a technical reason: one must be able to use Sequence_number::set_metadata().</span></div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span><span class="comment">   */</span></div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a1d027f817b86cc377d76bc38434229a4"> 1212</a></span>  <a class="code hl_class" href="classflow_1_1net__flow_1_1Sequence__number.html">Sequence_number</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a1d027f817b86cc377d76bc38434229a4">m_seq_num</a>;</div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span><span class="comment"></span> </div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span><span class="comment">  /// The delay between when we received the acknowledged packet and when decided to send this ack.</span></div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a6027b17d0ef0aa619c4dedb42d74e1a6"> 1215</a></span><span class="comment"></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a6027b17d0ef0aa619c4dedb42d74e1a6">m_delay</a>;</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span><span class="comment"></span> </div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span><span class="comment">   * Retransmit counter of the acknowledged Data_packet.  Identifies which attempt we are acknowledging</span></div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span><span class="comment">   * (0 = initial, 1 = first retransmit, 2 = second retransmit, ...).  Literally this equals the acked</span></div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span><span class="comment">   * Data_packet::m_rexmit_id.  Always 0 if retransmission is disabled for the given socket.</span></div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span><span class="comment">   */</span></div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#ae17b658ee88e60bdb6606af607b00de2"> 1222</a></span>  <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#ae17b658ee88e60bdb6606af607b00de2">m_rexmit_id</a>;</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span><span class="comment"></span> </div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span><span class="comment">  /// Make us noncopyable without breaking aggregateness (direct-init).</span></div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a589654d5b07e021e82fa80455863f548"> 1225</a></span><span class="comment"></span>  [[no_unique_address]] <a class="code hl_struct" href="structflow_1_1util_1_1Noncopyable.html">util::Noncopyable</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a589654d5b07e021e82fa80455863f548">m_nc</a>{};</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span>}; <span class="comment">// struct Ack_packet::Individual_ack</span></div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> </div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span><span class="keyword">static_assert</span>(std::is_aggregate_v&lt;Ack_packet::Individual_ack&gt;,</div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span>              <span class="stringliteral">&quot;We want it to be direct-initializable.&quot;</span>);</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span><span class="keyword">static_assert</span>((!std::is_copy_constructible_v&lt;Ack_packet::Individual_ack&gt;)</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span>                &amp;&amp; (!std::is_copy_assignable_v&lt;Ack_packet::Individual_ack&gt;),</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span>              <span class="stringliteral">&quot;We want it to be noncopyable but rather passed-around via its ::Ptr.&quot;</span>);</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> </div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span><span class="preprocessor">#pragma pack(push, 1)</span></div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span><span class="comment"></span> </div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span><span class="comment">/**</span></div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span><span class="comment"> * Specifies the *outgoing* (pre-serialization) acknowledgment of a single received Data_packet, when</span></div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span><span class="comment"> * retranmission is disabled on the socket.  Assuming network byte order equals native byte order,</span></div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span><span class="comment"> * and given that tight `struct` field packing is enabled throughout this code, one can arrange a tight</span></div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span><span class="comment"> * array of these `struct`s and transmit that entire array over the network with no need for scatter/gather</span></div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span><span class="comment"> * or any additional transformation of data post-construction and pushing onto aforementioned array.</span></div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span><span class="comment"> * These are copy-constructible, for pushing onto containers and such, but not assignable to avoid unnecessary</span></div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span><span class="comment"> * copying.  Update: A later version of clang does not like</span></div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span><span class="comment"> * this technique and warns about it; to avoid any such trouble just forget the non-assignability stuff;</span></div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span><span class="comment"> * it&#39;s internal code; we should be fine.</span></div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span><span class="comment"> *</span></div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span><span class="comment"> * @see Historical note in Ack_packet::serialize_to_raw_data() explains why this and</span></div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span><span class="comment"> *      Individual_ack_rexmit_on both exist, instead of simply using Individual_ack in both directions.</span></div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span><span class="comment"> */</span></div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html"> 1250</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html">Ack_packet::Individual_ack_rexmit_off</a></div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span>{</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span><span class="comment"></span> </div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span><span class="comment">  /// See Individual_ack::m_seq_num and Sequence_number::raw_num_ref().</span></div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#a8952017a9b9267971a8d79eaa82f358a"> 1255</a></span><span class="comment"></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Sequence__number.html#ab307e12c0cf8cefbe7fb1ec8588af2a8">Sequence_number::seq_num_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#a8952017a9b9267971a8d79eaa82f358a">m_seq_num_raw</a>;</div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span><span class="comment"></span> </div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span><span class="comment">  /// See Individual_ack::m_delay; this is in `Ack_delay_time_unit(1)` multiples.</span></div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#a9e2f29fb25f50cfb98779eba356882d8"> 1258</a></span><span class="comment"></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Ack__packet.html#a374da5eef60c7d8a4085b41cf7b2adfe">ack_delay_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#a9e2f29fb25f50cfb98779eba356882d8">m_delay</a>;</div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span> </div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_integer</div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span>                  &amp;&amp; (!std::numeric_limits&lt;Sequence_number::seq_num_t&gt;::is_signed),</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span>                <span class="stringliteral">&quot;Raw sequence numbers are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;ack_delay_t&gt;::is_integer</div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span>                  &amp;&amp; (!std::numeric_limits&lt;ack_delay_t&gt;::is_signed),</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span>                <span class="stringliteral">&quot;Time periods are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> </div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span><span class="comment"></span> </div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span><span class="comment">   * Constructs object.</span></div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span><span class="comment">   *</span></div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span><span class="comment">   * @param seq_num</span></div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span><span class="comment">   *        `seq_num.raw_num_ref()` is copied to #m_seq_num_raw.</span></div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span><span class="comment">   * @param delay</span></div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span><span class="comment">   *        #m_delay.</span></div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span><span class="comment">   */</span></div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#ab8f16251d8bd583cf6ad114a56b10463">Individual_ack_rexmit_off</a>(<span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1net__flow_1_1Sequence__number.html">Sequence_number</a>&amp; seq_num, <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Ack__packet.html#a374da5eef60c7d8a4085b41cf7b2adfe">ack_delay_t</a> delay);</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span>};</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span><span class="comment"></span> </div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span><span class="comment">/// Equivalent of `Individual_ack_rexmit_off` but for sockets with retransmission enabled.</span></div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html"> 1282</a></span><span class="comment"></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html">Ack_packet::Individual_ack_rexmit_on</a></div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span>{</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span><span class="comment"></span> </div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span><span class="comment">  /// Stores the values applicable to both Individual_ack_rexmit_off and Individual_ack_rexmit_on.</span></div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#ac0ea55d7d5847c4e892ef0e590bd580e"> 1287</a></span><span class="comment"></span>  <a class="code hl_struct" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html">Individual_ack_rexmit_off</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#ac0ea55d7d5847c4e892ef0e590bd580e">m_basic_ack</a>;</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span><span class="comment"></span> </div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span><span class="comment">  /// See Individual_ack::m_rexmit_id but note the type difference.</span></div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#a0324b8de1d20023e10507d527ee93cfe"> 1290</a></span><span class="comment"></span>  <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Data__packet.html#abba220658ada68bae04c9c2ebd06f72c">Data_packet::rexmit_id_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#a0324b8de1d20023e10507d527ee93cfe">m_rexmit_id</a>;</div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> </div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span>  <span class="comment">// Type checks.</span></div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span>  <span class="keyword">static_assert</span>(std::numeric_limits&lt;rexmit_id_t&gt;::is_integer</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span>                  &amp;&amp; (!std::numeric_limits&lt;rexmit_id_t&gt;::is_signed),</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span>                <span class="stringliteral">&quot;Retransmission IDs are non-negative integers.&quot;</span>);</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> </div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span><span class="comment"></span> </div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span><span class="comment">   * Constructs object.</span></div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span><span class="comment">   *</span></div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span><span class="comment">   * @param seq_num</span></div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span><span class="comment">   *        Individual_ack_rexmit_off::m_seq_num.</span></div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span><span class="comment">   * @param rexmit_id</span></div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span><span class="comment">   *        #m_rexmit_id.</span></div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span><span class="comment">   * @param delay</span></div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span><span class="comment">   *        Individual_ack_rexmit_off::m_delay.</span></div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span><span class="comment">   */</span></div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#ac75ea2d2954f67520dd4ed4c800c06c8">Individual_ack_rexmit_on</a>(<span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1net__flow_1_1Sequence__number.html">Sequence_number</a>&amp; seq_num, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rexmit_id, <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Ack__packet.html#a374da5eef60c7d8a4085b41cf7b2adfe">ack_delay_t</a> delay);</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span>};</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> </div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span><span class="preprocessor">#pragma pack(pop)</span></div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span><span class="comment"></span> </div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span><span class="comment">/**</span></div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span><span class="comment"> * Internal `net_flow` `struct` that encapsulates the Flow-protocol low-level RST packet.</span></div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span><span class="comment"> * See Low_lvl_packet doc header for information common to all low-level packets including this one.</span></div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span><span class="comment"> *</span></div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span><span class="comment"> * An RST means the sender is immediately shutting down the connection without waiting for any</span></div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span><span class="comment"> * feedback from the receiver and is recommending that the latter do the same ASAP.  This is sent in</span></div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span><span class="comment"> * a variety of error situations.</span></div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span><span class="comment"> *</span></div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span><span class="comment"> * Implemementation notes</span></div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span><span class="comment"> * ----------------------</span></div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span><span class="comment"> * The one peculiar thing about Rst_packet is it contains no data beyond the super-`struct` Low_lvl_packet,</span></div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span><span class="comment"> * other than the fact it *is* an Rst_packet (i.e., its `typeid()` identifies it as such).  Thus its</span></div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span><span class="comment"> * various `virtual` methods are typically either simple or even don&#39;t exist and defer to the Low_lvl_packet</span></div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span><span class="comment"> * implementation.</span></div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span><span class="comment"> */</span></div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Rst__packet.html"> 1329</a></span><span class="keyword">struct </span><a class="code hl_struct" href="structflow_1_1net__flow_1_1Rst__packet.html">Rst_packet</a> : <span class="keyword">public</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Low__lvl__packet.html">Low_lvl_packet</a></div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span>{</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> </div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span><span class="comment"></span> </div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span><span class="comment">   *</span></div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span><span class="comment">   * @param raw_bufs</span></div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span><span class="comment">   *        See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span><span class="comment">   * @return See Low_lvl_packet::serialize_to_raw_data().</span></div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span><span class="comment">   */</span></div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Rst__packet.html#a06e98008f816699dcd5c8890914a6b3f">serialize_to_raw_data</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">Const_buffer_sequence</a>* raw_bufs) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> </div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span><span class="comment"></span> </div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span><span class="comment">  /// In serialized packet, the type ID byte identifying this as an RST packet.  Must not equal any other packet type&#39;s.</span></div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Rst__packet.html#a915e6803b36ae470e585b1bc90622079"> 1346</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">uint8_t</a> <a class="code hl_variable" href="structflow_1_1net__flow_1_1Rst__packet.html#a915e6803b36ae470e585b1bc90622079">S_RAW_TYPE_ID</a>;</div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span> </div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span><span class="comment"></span> </div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span><span class="comment">  /// Friend of Rst_packet: For access to private constructor `Rst_packet(Logger*)`.</span></div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span><span class="comment"></span>  <span class="comment">// @todo Doxygen complains unless I make the above a Doxygen comment.  In other places it doesn&#39;t complain.  Fix...?</span></div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Rst__packet.html#aff60ca2747f412e64354ae0bd90b4126"> 1353</a></span>  <span class="keyword">friend</span> boost::shared_ptr&lt;Rst_packet&gt; Low_lvl_packet::create_uninit_packet&lt;Rst_packet&gt;(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>*);</div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span> </div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span><span class="comment"></span> </div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span><span class="comment">   * The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</span></div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span><span class="comment">   *</span></div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span><span class="comment">   *        Logger to use subsequently.</span></div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span><span class="comment">   */</span></div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Rst__packet.html#a171bf247cad883b73b4b76957dfe4994">Rst_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr);</div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span> </div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span><span class="comment"></span> </div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span><span class="comment">   * Implements Low_lvl_packet API.  See that super-method&#39;s doc header.</span></div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span><span class="comment">   *</span></div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span><span class="comment">   * @param raw_buf</span></div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span><span class="comment">   * @param prefer_no_move</span></div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span><span class="comment">   * @param raw_packet</span></div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span><span class="comment">   *        See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span><span class="comment">   * @return See Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet().</span></div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span><span class="comment">   */</span></div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Rst__packet.html#ae1292deb7eec0f01d3ff111977ff5693">deserialize_type_specific_data_from_raw_data_packet</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">Const_buffer</a>* raw_buf,</div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span>                                                           <span class="keywordtype">bool</span> prefer_no_move, <a class="code hl_typedef" href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">util::Blob</a>* raw_packet) <span class="keyword">override</span>;</div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span>}; <span class="comment">// struct Rst_packet</span></div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span> </div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span><span class="comment">// Template and constexpr implementations.</span></div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span> </div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Low_lvl_packet_sub&gt;</div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a09f0f187521ec2275885d68b7f6e734a"> 1385</a></span>boost::shared_ptr&lt;Low_lvl_packet_sub&gt; <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a09f0f187521ec2275885d68b7f6e734a">Low_lvl_packet::create_uninit_packet</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger) <span class="comment">// Static.</span></div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span>{</div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span>  <span class="keyword">using </span>boost::shared_ptr;</div>
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span> </div>
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span>  <span class="comment">// Note: Low_lvl_packet_sub is not Low_lvl_packet. It is a sub-type: Syn_packet, Ack_packet, etc. We&#39;re a template.</span></div>
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"> 1390</span> </div>
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span>  <span class="comment">// `friend` relation required to be able to call this private constructor.</span></div>
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"> 1392</span>  <span class="keywordflow">return</span> shared_ptr&lt;Low_lvl_packet_sub&gt;(<span class="keyword">new</span> Low_lvl_packet_sub(logger));</div>
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span>}</div>
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span> </div>
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Low_lvl_packet_sub&gt;</div>
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a64981689c6d162131889bd90ef003279"> 1396</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Low_lvl_packet::Ptr</a> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a64981689c6d162131889bd90ef003279">Low_lvl_packet::create_uninit_packet_base</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger) <span class="comment">// Static.</span></div>
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span>{</div>
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span>  <span class="keywordflow">return</span> <a class="code hl_function" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81">Low_lvl_packet::ptr_cast</a>(create_uninit_packet&lt;Low_lvl_packet_sub&gt;(logger));</div>
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span>}</div>
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span> </div>
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a57c06fd2d0b1c3ac058c13f9081067f0"> 1401</a></span><span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a57c06fd2d0b1c3ac058c13f9081067f0">Low_lvl_packet::native_is_big_endian</a>() <span class="comment">// Static.</span></div>
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span>{</div>
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span>  <span class="keyword">using </span>boost::endian::native_to_big;</div>
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span> </div>
<div class="line"><a id="l01405" name="l01405"></a><span class="lineno"> 1405</span>  <span class="keyword">constexpr</span> uint16_t TEST_VAL = 0x0102;</div>
<div class="line"><a id="l01406" name="l01406"></a><span class="lineno"> 1406</span>  <span class="keywordflow">return</span> native_to_big(TEST_VAL) == TEST_VAL;</div>
<div class="line"><a id="l01407" name="l01407"></a><span class="lineno"> 1407</span>}</div>
<div class="line"><a id="l01408" name="l01408"></a><span class="lineno"> 1408</span> </div>
<div class="line"><a id="l01409" name="l01409"></a><span class="lineno"> 1409</span>} <span class="comment">// namespace flow::net_flow</span></div>
<div class="ttc" id="ablob_8hpp_html"><div class="ttname"><a href="blob_8hpp.html">blob.hpp</a></div></div>
<div class="ttc" id="aclassflow_1_1Function_html"><div class="ttname"><a href="classflow_1_1Function.html">flow::Function</a></div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00512">common.hpp:512</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Log__context_html"><div class="ttname"><a href="classflow_1_1log_1_1Log__context.html">flow::log::Log_context</a></div><div class="ttdoc">Convenience class that simply stores a Logger and/or Component passed into a constructor; and returns...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l01609">log.hpp:1610</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Logger_html"><div class="ttname"><a href="classflow_1_1log_1_1Logger.html">flow::log::Logger</a></div><div class="ttdoc">Interface that the user should implement, passing the implementing Logger into logging classes (Flow'...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l01280">log.hpp:1284</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Sequence__number_html"><div class="ttname"><a href="classflow_1_1net__flow_1_1Sequence__number.html">flow::net_flow::Sequence_number</a></div><div class="ttdoc">An internal net_flow sequence number identifying a piece of data.</div><div class="ttdef"><b>Definition:</b> <a href="seq__num_8hpp_source.html#l00125">seq_num.hpp:126</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Sequence__number_html_ab307e12c0cf8cefbe7fb1ec8588af2a8"><div class="ttname"><a href="classflow_1_1net__flow_1_1Sequence__number.html#ab307e12c0cf8cefbe7fb1ec8588af2a8">flow::net_flow::Sequence_number::seq_num_t</a></div><div class="ttdeci">uint64_t seq_num_t</div><div class="ttdoc">Raw sequence number type.</div><div class="ttdef"><b>Definition:</b> <a href="seq__num_8hpp_source.html#l00138">seq_num.hpp:138</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Null__interface_html"><div class="ttname"><a href="classflow_1_1util_1_1Null__interface.html">flow::util::Null_interface</a></div><div class="ttdoc">An empty interface, consisting of nothing but a default virtual destructor, intended as a boiler-plat...</div><div class="ttdef"><b>Definition:</b> <a href="util_2util_8hpp_source.html#l00044">util.hpp:45</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html">flow::util::Shared_ptr_alias_holder</a></div><div class="ttdoc">Convenience class template that endows the given subclass T with nested aliases Ptr and Const_ptr ali...</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00119">shared_ptr_alias_holder.hpp:120</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html_a55a247bb8fb2ec94b7cbfdd56be65a81"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Low_lvl_packet &gt; &gt;::ptr_cast</a></div><div class="ttdeci">static Ptr ptr_cast(const From_ptr &amp;ptr_to_cast)</div><div class="ttdoc">Provides syntactic-sugary way to perform a static_pointer_cast&lt;&gt; from a compatible smart pointer type...</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00142">shared_ptr_alias_holder.hpp:187</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html_aa4f1af88393042e60159a3a67f0accbc"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Low_lvl_packet &gt; &gt;::Ptr</a></div><div class="ttdeci">boost::shared_ptr&lt; Low_lvl_packet &gt; Ptr</div><div class="ttdoc">Short-hand for ref-counted pointer to mutable values of type Target_type::element_type (a-la T*).</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00125">shared_ptr_alias_holder.hpp:125</a></div></div>
<div class="ttc" id="adetail_2net__flow__fwd_8hpp_html"><div class="ttname"><a href="detail_2net__flow__fwd_8hpp.html">net_flow_fwd.hpp</a></div></div>
<div class="ttc" id="alog_8hpp_html"><div class="ttname"><a href="log_8hpp.html">log.hpp</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html"><div class="ttname"><a href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div><div class="ttdoc">Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...</div><div class="ttdef"><b>Definition:</b> <a href="asio_2node_8cpp_source.html#l00024">node.cpp:25</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html_a079d8cd87a68d1c5f04c6bce71f0061d"><div class="ttname"><a href="namespaceflow_1_1net__flow.html#a079d8cd87a68d1c5f04c6bce71f0061d">flow::net_flow::flow_port_t</a></div><div class="ttdeci">uint16_t flow_port_t</div><div class="ttdoc">Logical Flow port type (analogous to a UDP/TCP port in spirit but in no way relevant to UDP/TCP).</div><div class="ttdef"><b>Definition:</b> <a href="net__flow__fwd_8hpp_source.html#l00054">net_flow_fwd.hpp:54</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_af09888b3a8feaff209b6625e493bc338"><div class="ttname"><a href="namespaceflow_1_1util.html#af09888b3a8feaff209b6625e493bc338">flow::util::Blob</a></div><div class="ttdeci">Blob_with_log_context&lt;&gt; Blob</div><div class="ttdoc">A concrete Blob_with_log_context that compile-time-disables Basic_blob::share() and the sharing API d...</div><div class="ttdef"><b>Definition:</b> <a href="blob__fwd_8hpp_source.html#l00060">blob_fwd.hpp:60</a></div></div>
<div class="ttc" id="anamespaceflow_html_a48799f1263cdeedec125be51a3db2b79"><div class="ttname"><a href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">flow::Fine_duration</a></div><div class="ttdeci">Fine_clock::duration Fine_duration</div><div class="ttdoc">A high-res time duration as computed from two Fine_time_pts.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00416">common.hpp:416</a></div></div>
<div class="ttc" id="anamespaceflow_html_ae02da22c4a101eaab447511c905e4f32"><div class="ttname"><a href="namespaceflow.html#ae02da22c4a101eaab447511c905e4f32">flow::uint8_t</a></div><div class="ttdeci">unsigned char uint8_t</div><div class="ttdoc">Byte. Best way to represent a byte of binary data. This is 8 bits on all modern systems.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00391">common.hpp:391</a></div></div>
<div class="ttc" id="anet__flow__fwd_8hpp_html"><div class="ttname"><a href="net__flow__fwd_8hpp.html">net_flow_fwd.hpp</a></div></div>
<div class="ttc" id="aseq__num_8hpp_html"><div class="ttname"><a href="seq__num_8hpp.html">seq_num.hpp</a></div></div>
<div class="ttc" id="ashared__ptr__alias__holder_8hpp_html"><div class="ttname"><a href="shared__ptr__alias__holder_8hpp.html">shared_ptr_alias_holder.hpp</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html">flow::net_flow::Ack_packet::Individual_ack_rexmit_off</a></div><div class="ttdoc">Specifies the outgoing (pre-serialization) acknowledgment of a single received Data_packet,...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01250">low_lvl_packet.hpp:1251</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off_html_a8952017a9b9267971a8d79eaa82f358a"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#a8952017a9b9267971a8d79eaa82f358a">flow::net_flow::Ack_packet::Individual_ack_rexmit_off::m_seq_num_raw</a></div><div class="ttdeci">const Sequence_number::seq_num_t m_seq_num_raw</div><div class="ttdoc">See Individual_ack::m_seq_num and Sequence_number::raw_num_ref().</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01255">low_lvl_packet.hpp:1255</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off_html_a9e2f29fb25f50cfb98779eba356882d8"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#a9e2f29fb25f50cfb98779eba356882d8">flow::net_flow::Ack_packet::Individual_ack_rexmit_off::m_delay</a></div><div class="ttdeci">const ack_delay_t m_delay</div><div class="ttdoc">See Individual_ack::m_delay; this is in Ack_delay_time_unit(1) multiples.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01258">low_lvl_packet.hpp:1258</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off_html_ab8f16251d8bd583cf6ad114a56b10463"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__off.html#ab8f16251d8bd583cf6ad114a56b10463">flow::net_flow::Ack_packet::Individual_ack_rexmit_off::Individual_ack_rexmit_off</a></div><div class="ttdeci">Individual_ack_rexmit_off(const Sequence_number &amp;seq_num, ack_delay_t delay)</div><div class="ttdoc">Constructs object.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l01059">low_lvl_packet.cpp:1059</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html">flow::net_flow::Ack_packet::Individual_ack_rexmit_on</a></div><div class="ttdoc">Equivalent of Individual_ack_rexmit_off but for sockets with retransmission enabled.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01282">low_lvl_packet.hpp:1283</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on_html_a0324b8de1d20023e10507d527ee93cfe"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#a0324b8de1d20023e10507d527ee93cfe">flow::net_flow::Ack_packet::Individual_ack_rexmit_on::m_rexmit_id</a></div><div class="ttdeci">Data_packet::rexmit_id_t m_rexmit_id</div><div class="ttdoc">See Individual_ack::m_rexmit_id but note the type difference.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01290">low_lvl_packet.hpp:1290</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on_html_ac0ea55d7d5847c4e892ef0e590bd580e"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#ac0ea55d7d5847c4e892ef0e590bd580e">flow::net_flow::Ack_packet::Individual_ack_rexmit_on::m_basic_ack</a></div><div class="ttdeci">Individual_ack_rexmit_off m_basic_ack</div><div class="ttdoc">Stores the values applicable to both Individual_ack_rexmit_off and Individual_ack_rexmit_on.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01287">low_lvl_packet.hpp:1287</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on_html_ac75ea2d2954f67520dd4ed4c800c06c8"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack__rexmit__on.html#ac75ea2d2954f67520dd4ed4c800c06c8">flow::net_flow::Ack_packet::Individual_ack_rexmit_on::Individual_ack_rexmit_on</a></div><div class="ttdeci">Individual_ack_rexmit_on(const Sequence_number &amp;seq_num, unsigned int rexmit_id, ack_delay_t delay)</div><div class="ttdoc">Constructs object.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l01067">low_lvl_packet.cpp:1067</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html">flow::net_flow::Ack_packet::Individual_ack</a></div><div class="ttdoc">Specifies the incoming (post-deserialization) acknowledgment of a single received Data_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01195">low_lvl_packet.hpp:1197</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack_html_a1d027f817b86cc377d76bc38434229a4"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a1d027f817b86cc377d76bc38434229a4">flow::net_flow::Ack_packet::Individual_ack::m_seq_num</a></div><div class="ttdeci">Sequence_number m_seq_num</div><div class="ttdoc">Sequence number of first datum in packet that we acknowledge.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01212">low_lvl_packet.hpp:1212</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack_html_a55bebcb04b4cc192e38023e58bfd761c"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a55bebcb04b4cc192e38023e58bfd761c">flow::net_flow::Ack_packet::Individual_ack::Const_ptr</a></div><div class="ttdeci">boost::shared_ptr&lt; const Individual_ack &gt; Const_ptr</div><div class="ttdoc">Short-hand for ref-counted pointer to immutable objects of this class.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01204">low_lvl_packet.hpp:1204</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack_html_a589654d5b07e021e82fa80455863f548"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a589654d5b07e021e82fa80455863f548">flow::net_flow::Ack_packet::Individual_ack::m_nc</a></div><div class="ttdeci">util::Noncopyable m_nc</div><div class="ttdoc">Make us noncopyable without breaking aggregateness (direct-init).</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01225">low_lvl_packet.hpp:1225</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack_html_a6027b17d0ef0aa619c4dedb42d74e1a6"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#a6027b17d0ef0aa619c4dedb42d74e1a6">flow::net_flow::Ack_packet::Individual_ack::m_delay</a></div><div class="ttdeci">const Fine_duration m_delay</div><div class="ttdoc">The delay between when we received the acknowledged packet and when decided to send this ack.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01215">low_lvl_packet.hpp:1215</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack_html_abbd41e30089125f67667b39f5756c275"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#abbd41e30089125f67667b39f5756c275">flow::net_flow::Ack_packet::Individual_ack::Ptr</a></div><div class="ttdeci">boost::shared_ptr&lt; Individual_ack &gt; Ptr</div><div class="ttdoc">Short-hand for ref-counted pointer to mutable objects of this class.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01201">low_lvl_packet.hpp:1201</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack_html_ae17b658ee88e60bdb6606af607b00de2"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet_1_1Individual__ack.html#ae17b658ee88e60bdb6606af607b00de2">flow::net_flow::Ack_packet::Individual_ack::m_rexmit_id</a></div><div class="ttdeci">const unsigned int m_rexmit_id</div><div class="ttdoc">Retransmit counter of the acknowledged Data_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01222">low_lvl_packet.hpp:1222</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html">flow::net_flow::Ack_packet</a></div><div class="ttdoc">Internal net_flow struct that encapsulates the Flow-protocol low-level ACK packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01020">low_lvl_packet.hpp:1021</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_a232e22e04614ead19fa4531a89838015"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#a232e22e04614ead19fa4531a89838015">flow::net_flow::Ack_packet::m_rcv_acked_packets</a></div><div class="ttdeci">std::vector&lt; boost::shared_ptr&lt; Individual_ack &gt; &gt; m_rcv_acked_packets</div><div class="ttdoc">List of incoming (post-deserialization of ACK) acknowledgments of DATA packets, each identified by it...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01116">low_lvl_packet.hpp:1116</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_a374da5eef60c7d8a4085b41cf7b2adfe"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#a374da5eef60c7d8a4085b41cf7b2adfe">flow::net_flow::Ack_packet::ack_delay_t</a></div><div class="ttdeci">uint64_t ack_delay_t</div><div class="ttdoc">Type used to store the ACK delay for a given individual acknowledged packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01040">low_lvl_packet.hpp:1040</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_a49659e0e672d324ad17e2f4240604b49"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#a49659e0e672d324ad17e2f4240604b49">flow::net_flow::Ack_packet::to_ostream</a></div><div class="ttdeci">std::ostream &amp; to_ostream(std::ostream &amp;os, bool verbose) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00995">low_lvl_packet.cpp:995</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_a56b2560b87540a3cf5c7bba9e9666641"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#a56b2560b87540a3cf5c7bba9e9666641">flow::net_flow::Ack_packet::m_rcv_wnd</a></div><div class="ttdeci">rcv_wnd_t m_rcv_wnd</div><div class="ttdoc">Current receive window (remaining Receive buffer size) of the ACK sender.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01052">low_lvl_packet.hpp:1052</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_a5af95ad4de8253b613d55a99d41cb430"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#a5af95ad4de8253b613d55a99d41cb430">flow::net_flow::Ack_packet::deserialize_type_specific_data_from_raw_data_packet</a></div><div class="ttdeci">bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00784">low_lvl_packet.cpp:784</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_a878162c8ec16ab4ee1b3ea4bbe4b51c0"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#a878162c8ec16ab4ee1b3ea4bbe4b51c0">flow::net_flow::Ack_packet::serialize_to_raw_data</a></div><div class="ttdeci">size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00320">low_lvl_packet.cpp:320</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_aa57707612db973cb99a12ef81f091c38"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#aa57707612db973cb99a12ef81f091c38">flow::net_flow::Ack_packet::S_RAW_TYPE_ID</a></div><div class="ttdeci">static const uint8_t S_RAW_TYPE_ID</div><div class="ttdoc">In serialized packet, the type ID byte identifying this as an ACK packet. Must not equal any other pa...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01132">low_lvl_packet.hpp:1132</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_aae3806ebf76e628494fd6f7681c01409"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#aae3806ebf76e628494fd6f7681c01409">flow::net_flow::Ack_packet::m_rcv_acked_packets_rexmit_out_size</a></div><div class="ttdeci">uint16_t m_rcv_acked_packets_rexmit_out_size</div><div class="ttdoc">This is the serialized version of m_rcv_acked_packets_rexmit_{on|off}_out.size() and m_rcv_acked_pack...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01063">low_lvl_packet.hpp:1063</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_abd3bc7f9e9195bf1b4aca2cad881646c"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#abd3bc7f9e9195bf1b4aca2cad881646c">flow::net_flow::Ack_packet::Ack_delay_time_unit</a></div><div class="ttdeci">Fine_duration Ack_delay_time_unit</div><div class="ttdoc">Ack_delay_time_unit(1) is the duration corresponding to the ack_delay_t value 1; and proportionally f...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01043">low_lvl_packet.hpp:1043</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_abfcb97c4f3f8552c619b6aba07674063"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#abfcb97c4f3f8552c619b6aba07674063">flow::net_flow::Ack_packet::m_rcv_acked_packets_rexmit_on_out</a></div><div class="ttdeci">std::vector&lt; Individual_ack_rexmit_on &gt; m_rcv_acked_packets_rexmit_on_out</div><div class="ttdoc">Equivalent of m_rcv_acked_packets_rexmit_off_out but for retransmission enabled.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01129">low_lvl_packet.hpp:1129</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_acef61dca75aa49d653acdfd96b065723"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#acef61dca75aa49d653acdfd96b065723">flow::net_flow::Ack_packet::Ack_packet</a></div><div class="ttdeci">Ack_packet(log::Logger *logger_ptr)</div><div class="ttdoc">The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00096">low_lvl_packet.cpp:96</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Ack__packet_html_aebad844e9061da02db8f168374869f9e"><div class="ttname"><a href="structflow_1_1net__flow_1_1Ack__packet.html#aebad844e9061da02db8f168374869f9e">flow::net_flow::Ack_packet::m_rcv_acked_packets_rexmit_off_out</a></div><div class="ttdeci">std::vector&lt; Individual_ack_rexmit_off &gt; m_rcv_acked_packets_rexmit_off_out</div><div class="ttdoc">Equivalent of m_rcv_acked_packets but used for outgoing (pre-serialization of ACK) acknowledgments an...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01126">low_lvl_packet.hpp:1126</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html">flow::net_flow::Data_packet</a></div><div class="ttdoc">Internal net_flow struct that encapsulates the Flow-protocol low-level DATA packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00893">low_lvl_packet.hpp:894</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_a07cf37a89d947f40354a79a885407567"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#a07cf37a89d947f40354a79a885407567">flow::net_flow::Data_packet::m_data_size_raw</a></div><div class="ttdeci">uint16_t m_data_size_raw</div><div class="ttdoc">This is the serialized version of m_data.size() (see m_data).</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00926">low_lvl_packet.hpp:926</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_a0bfa19b23164c8189c05d3c2417cf23b"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#a0bfa19b23164c8189c05d3c2417cf23b">flow::net_flow::Data_packet::to_ostream</a></div><div class="ttdeci">std::ostream &amp; to_ostream(std::ostream &amp;os, bool verbose) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00967">low_lvl_packet.cpp:967</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_a0c5cb656fd8fd513d66a349285558900"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#a0c5cb656fd8fd513d66a349285558900">flow::net_flow::Data_packet::Data_packet</a></div><div class="ttdeci">Data_packet(log::Logger *logger_ptr)</div><div class="ttdoc">The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00088">low_lvl_packet.cpp:88</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_a463336b35dde27c250b477ca35adb7d4"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#a463336b35dde27c250b477ca35adb7d4">flow::net_flow::Data_packet::S_RAW_TYPE_ID</a></div><div class="ttdeci">static const uint8_t S_RAW_TYPE_ID</div><div class="ttdoc">In serialized packet, the type ID byte identifying this as a DATA packet. Must not equal any other pa...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00945">low_lvl_packet.hpp:945</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_a94d817529e94ac88ee2cea6f3dd1badb"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#a94d817529e94ac88ee2cea6f3dd1badb">flow::net_flow::Data_packet::m_seq_num</a></div><div class="ttdeci">Sequence_number m_seq_num</div><div class="ttdoc">The sequence number of the first byte in the payload; i.e., of m_data.front(), a/k/a m_data[0].</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00911">low_lvl_packet.hpp:911</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_abba220658ada68bae04c9c2ebd06f72c"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#abba220658ada68bae04c9c2ebd06f72c">flow::net_flow::Data_packet::rexmit_id_t</a></div><div class="ttdeci">uint8_t rexmit_id_t</div><div class="ttdoc">Type used to store the retransmission count in DATA and ACK packets.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00903">low_lvl_packet.hpp:903</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_ac149f87b8915213857c707b0f3562ef0"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#ac149f87b8915213857c707b0f3562ef0">flow::net_flow::Data_packet::m_rexmit_id</a></div><div class="ttdeci">rexmit_id_t m_rexmit_id</div><div class="ttdoc">Retransmit counter of the DATA packet being sent.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00917">low_lvl_packet.hpp:917</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_ac2a390c4cb7abfeec7c658c866dbfc06"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#ac2a390c4cb7abfeec7c658c866dbfc06">flow::net_flow::Data_packet::deserialize_type_specific_data_from_raw_data_packet</a></div><div class="ttdeci">bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00654">low_lvl_packet.cpp:654</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_ad76ae289cd958d62bb5cd29b9f9e894d"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#ad76ae289cd958d62bb5cd29b9f9e894d">flow::net_flow::Data_packet::m_data</a></div><div class="ttdeci">util::Blob m_data</div><div class="ttdoc">The payload.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00934">low_lvl_packet.hpp:934</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Data__packet_html_add582f24dd9442f987f2c458e4b5d3d7"><div class="ttname"><a href="structflow_1_1net__flow_1_1Data__packet.html#add582f24dd9442f987f2c458e4b5d3d7">flow::net_flow::Data_packet::serialize_to_raw_data</a></div><div class="ttdeci">size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00278">low_lvl_packet.cpp:278</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html">flow::net_flow::Low_lvl_packet::Aux_raw_data</a></div><div class="ttdoc">Helper data store type for storing binary data needed by serialize_to_raw_data(), when certains bits ...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00439">low_lvl_packet.hpp:441</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data_html_a22799fa7c7948cc2f35a411523c12479"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a22799fa7c7948cc2f35a411523c12479">flow::net_flow::Low_lvl_packet::Aux_raw_data::m_opt_rexmit_on_raw</a></div><div class="ttdeci">uint8_t m_opt_rexmit_on_raw</div><div class="ttdoc">This is the serialized version of the multi-byte bool Low_lvl_packet::m_opt_rexmit_on.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00448">low_lvl_packet.hpp:448</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data_html_a244e09a3f5318c25a120e3d29379adc8"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a244e09a3f5318c25a120e3d29379adc8">flow::net_flow::Low_lvl_packet::Aux_raw_data::m_reserved2</a></div><div class="ttdeci">const uint16_t m_reserved2</div><div class="ttdoc">Unused space reserved for future use, ensuring correct alignment of other fields and headers.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00455">low_lvl_packet.hpp:455</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data_html_a7ae37084e00d375a749c3730f77e6072"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Aux__raw__data.html#a7ae37084e00d375a749c3730f77e6072">flow::net_flow::Low_lvl_packet::Aux_raw_data::Aux_raw_data</a></div><div class="ttdeci">Aux_raw_data()</div><div class="ttdoc">Constructs a mostly-uninitialized object, except for the const member(s), if any.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00048">low_lvl_packet.cpp:48</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html">flow::net_flow::Low_lvl_packet::Packet_type_info</a></div><div class="ttdoc">A simple, unmodifiable data store that contains the properties unique to each packet type a/k/a concr...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00469">low_lvl_packet.hpp:470</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info_html_a167901d7c0f96f240dd789027ad99dc5"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html#a167901d7c0f96f240dd789027ad99dc5">flow::net_flow::Low_lvl_packet::Packet_type_info::m_raw_type_id</a></div><div class="ttdeci">const uint8_t m_raw_type_id</div><div class="ttdoc">The type ID value, in serialized order, to be used in each serialization of all packets of this type.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00472">low_lvl_packet.hpp:472</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info_html_a8dc054626823cb59a1570214349b8450"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet_1_1Packet__type__info.html#a8dc054626823cb59a1570214349b8450">flow::net_flow::Low_lvl_packet::Packet_type_info::m_type_id_str</a></div><div class="ttdeci">const std::string m_type_id_str</div><div class="ttdoc">The brief string representation of this packet type, suitable for Low_lvl_packet::type_id_to_str().</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00475">low_lvl_packet.hpp:475</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html">flow::net_flow::Low_lvl_packet</a></div><div class="ttdoc">Internal net_flow struct that encapsulates the Flow-protocol low-level packet structure and serves as...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00165">low_lvl_packet.hpp:171</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a01ff17bec742d9e363aea2ecd23f2f72"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a01ff17bec742d9e363aea2ecd23f2f72">flow::net_flow::Low_lvl_packet::rcv_wnd_t</a></div><div class="ttdeci">uint32_t rcv_wnd_t</div><div class="ttdoc">Type used to store the size of m_rcv_wnd member in a couple of different packet types.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00203">low_lvl_packet.hpp:203</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a09f0f187521ec2275885d68b7f6e734a"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a09f0f187521ec2275885d68b7f6e734a">flow::net_flow::Low_lvl_packet::create_uninit_packet</a></div><div class="ttdeci">static boost::shared_ptr&lt; Low_lvl_packet_sub &gt; create_uninit_packet(log::Logger *logger_ptr)</div><div class="ttdoc">Constructs packet with uninitialized (essentially random) values, of the Low_lvl_packet sub-type spec...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01385">low_lvl_packet.hpp:1385</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a11e7750d22415a381e23112062f7ca74"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a11e7750d22415a381e23112062f7ca74">flow::net_flow::Low_lvl_packet::rexmit_id_t</a></div><div class="ttdeci">uint8_t rexmit_id_t</div><div class="ttdoc">Type used to store the retransmission count in DATA and ACK packets.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00200">low_lvl_packet.hpp:200</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a1295f44e5a4ebdece11ed6d0eea0fbaa"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a1295f44e5a4ebdece11ed6d0eea0fbaa">flow::net_flow::Low_lvl_packet::m_aux_raw_data</a></div><div class="ttdeci">Aux_raw_data m_aux_raw_data</div><div class="ttdoc">Auxilliary data area necessary for serialize_to_raw_data() to work.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00572">low_lvl_packet.hpp:572</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a186d7dae0c4b4402aed22a25d595ed30"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a186d7dae0c4b4402aed22a25d595ed30">flow::net_flow::Low_lvl_packet::create_from_raw_data_packet</a></div><div class="ttdeci">static Ptr create_from_raw_data_packet(log::Logger *logger_ptr, util::Blob *raw_packet, bool prefer_no_move)</div><div class="ttdoc">Constructs packet on the heap with values determined by the given raw binary data as presumably recei...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00380">low_lvl_packet.cpp:380</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a37c9c6b04502d73defb803c1efabdf63"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a37c9c6b04502d73defb803c1efabdf63">flow::net_flow::Low_lvl_packet::type_id_to_str</a></div><div class="ttdeci">static const std::string &amp; type_id_to_str(const std::type_index &amp;type_id)</div><div class="ttdoc">Returns a brief (a few characters) string description of the given packet type given as type_index(ty...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00108">low_lvl_packet.cpp:108</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a3e7152648c0098491512da590b47b464"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a3e7152648c0098491512da590b47b464">flow::net_flow::Low_lvl_packet::m_packed</a></div><div class="ttdeci">struct flow::net_flow::Low_lvl_packet::@7 m_packed</div><div class="ttdoc">Packed group affected by #pragma pack.</div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a47e9143f0b9dd4ae9d8c5ace666d5539"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a47e9143f0b9dd4ae9d8c5ace666d5539">flow::net_flow::Low_lvl_packet::to_ostream</a></div><div class="ttdeci">virtual std::ostream &amp; to_ostream(std::ostream &amp;os, bool verbose=false) const</div><div class="ttdoc">Writes a multi-line representation of *this to an output stream.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00911">low_lvl_packet.cpp:911</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a4a0585d1abae63af891161f1719bc582"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a4a0585d1abae63af891161f1719bc582">flow::net_flow::Low_lvl_packet::Low_lvl_packet</a></div><div class="ttdeci">Low_lvl_packet(log::Logger *logger_ptr)</div><div class="ttdoc">Constructs packet with uninitialized (essentially random) values.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00054">low_lvl_packet.cpp:54</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a521afb86aaf334b871c9226ce503c508"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a521afb86aaf334b871c9226ce503c508">flow::net_flow::Low_lvl_packet::S_NATIVE_TYPE_ID_TO_PACKET_TYPE_INFO</a></div><div class="ttdeci">static const boost::unordered_map&lt; std::type_index, Packet_type_info &gt; S_NATIVE_TYPE_ID_TO_PACKET_TYPE_INFO</div><div class="ttdoc">Mapping from native typeid(), a/k/a packet type (for all possible packet types), to the set of proper...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00559">low_lvl_packet.hpp:559</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a57c06fd2d0b1c3ac058c13f9081067f0"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a57c06fd2d0b1c3ac058c13f9081067f0">flow::net_flow::Low_lvl_packet::native_is_big_endian</a></div><div class="ttdeci">static constexpr bool native_is_big_endian()</div><div class="ttdoc">Returns true, at compile time, if and only if the native memory representation is big-endian,...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01401">low_lvl_packet.hpp:1401</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a5856c405aa18f4f54a35515786befea8"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a5856c405aa18f4f54a35515786befea8">flow::net_flow::Low_lvl_packet::serialize_to_raw_data_and_log</a></div><div class="ttdeci">size_t serialize_to_raw_data_and_log(Const_buffer_sequence *raw_bufs) const</div><div class="ttdoc">Identical to serialize_to_raw_data() but adds log-level-appropriate logging after the operation.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00130">low_lvl_packet.cpp:130</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a5c6a0e32bfe5616843746319533ca2c1"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a5c6a0e32bfe5616843746319533ca2c1">flow::net_flow::Low_lvl_packet::deserialize_type_specific_data_from_raw_data_packet</a></div><div class="ttdeci">virtual bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet)=0</div><div class="ttdoc">virtual helper for create_from_raw_data_packet() that fills out the fields of *this that are not in L...</div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a64981689c6d162131889bd90ef003279"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a64981689c6d162131889bd90ef003279">flow::net_flow::Low_lvl_packet::create_uninit_packet_base</a></div><div class="ttdeci">static Ptr create_uninit_packet_base(log::Logger *logger_ptr)</div><div class="ttdoc">A simple convenience method that casts the result of create_uninit_packet() from shared_ptr&lt;T&gt;,...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01396">low_lvl_packet.hpp:1396</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a6b3de1eb7a337002440ecd1ab0ad058f"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6b3de1eb7a337002440ecd1ab0ad058f">flow::net_flow::Low_lvl_packet::type_id_native_to_raw</a></div><div class="ttdeci">static const uint8_t &amp; type_id_native_to_raw(const std::type_info &amp;type_id)</div><div class="ttdoc">Helper that looks up the Packet_type_info::m_raw_type_id value for the given typeid(p),...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00119">low_lvl_packet.cpp:119</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a6e16e9c355c6d5e2acff5f9bdc24f397"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a6e16e9c355c6d5e2acff5f9bdc24f397">flow::net_flow::Low_lvl_packet::Const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; Const_buffer &gt; Const_buffer_sequence</div><div class="ttdoc">Short-hand for sequence of immutable buffers; i.e., a sequence of 1 or more scattered areas in memory...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00189">low_lvl_packet.hpp:189</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a720372b60ae7b7ee23c9f2d6775c7de1"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a720372b60ae7b7ee23c9f2d6775c7de1">flow::net_flow::Low_lvl_packet::type_to_ostream</a></div><div class="ttdeci">std::ostream &amp; type_to_ostream(std::ostream &amp;os) const</div><div class="ttdoc">Writes a brief representation of typeid(*this) – i.e., the packet type (ACK, RST, etc....</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l01052">low_lvl_packet.cpp:1052</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a786030d997a7602733a6a4422cb34274"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a786030d997a7602733a6a4422cb34274">flow::net_flow::Low_lvl_packet::m_dst_port</a></div><div class="ttdeci">flow_port_t m_dst_port</div><div class="ttdoc">Flow-protocol port # of socket in receiving Node.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00234">low_lvl_packet.hpp:234</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a7f4fd9ce69e293477e96fbad0a2298ed"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a7f4fd9ce69e293477e96fbad0a2298ed">flow::net_flow::Low_lvl_packet::m_type_ostream_manip</a></div><div class="ttdeci">const Function&lt; std::ostream &amp;(std::ostream &amp;)&gt; m_type_ostream_manip</div><div class="ttdoc">ostream manipulator (argument to ostream &lt;&lt;) that will output packet's type (&quot;ACK&quot;,...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00246">low_lvl_packet.hpp:246</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a872044469cfa05a3abf3f9ab1c7cf03b"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a872044469cfa05a3abf3f9ab1c7cf03b">flow::net_flow::Low_lvl_packet::security_token_t</a></div><div class="ttdeci">uint64_t security_token_t</div><div class="ttdoc">Type used for m_security_token member of a couple different packet types.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00192">low_lvl_packet.hpp:192</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_a89bbdc4968a82877de3d7bcba3597c2c"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#a89bbdc4968a82877de3d7bcba3597c2c">flow::net_flow::Low_lvl_packet::m_concise_ostream_manip</a></div><div class="ttdeci">const Function&lt; std::ostream &amp;(std::ostream &amp;)&gt; m_concise_ostream_manip</div><div class="ttdoc">ostream manipulator (argument to ostream &lt;&lt;) that will output packet info suitable for TRACE log leve...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00252">low_lvl_packet.hpp:252</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_aa2b4697824bd3ca88970c67d9a1f3e76"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#aa2b4697824bd3ca88970c67d9a1f3e76">flow::net_flow::Low_lvl_packet::serialize_to_raw_data</a></div><div class="ttdeci">virtual size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const =0</div><div class="ttdoc">Serializes the current logical packet data from *this into the given Const_buffer_sequence,...</div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_ab735867345855ad43e5e3ff788cf5a9a"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ab735867345855ad43e5e3ff788cf5a9a">flow::net_flow::Low_lvl_packet::Const_buffer</a></div><div class="ttdeci">boost::asio::const_buffer Const_buffer</div><div class="ttdoc">Short-hand for boost.asio immutable buffer, which essentially is a pointer to and length of a memory ...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00180">low_lvl_packet.hpp:180</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_ac7b199700e34d3cc17a7653d7bbb134b"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ac7b199700e34d3cc17a7653d7bbb134b">flow::net_flow::Low_lvl_packet::serialize_common_header_to_raw_data</a></div><div class="ttdeci">size_t serialize_common_header_to_raw_data(Const_buffer_sequence *raw_bufs) const</div><div class="ttdoc">Helper for serialize_to_raw_data() implementations in sub-types that encodes the header common to all...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00158">low_lvl_packet.cpp:158</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_acc2a10d19e8e54c88518ad2e02a08b68"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#acc2a10d19e8e54c88518ad2e02a08b68">flow::net_flow::Low_lvl_packet::m_opt_rexmit_on</a></div><div class="ttdeci">bool m_opt_rexmit_on</div><div class="ttdoc">Option indicating whether this connection is using retransmission or not.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00223">low_lvl_packet.hpp:223</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_ae3e64b049838a690384a899209ffca7b"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ae3e64b049838a690384a899209ffca7b">flow::net_flow::Low_lvl_packet::m_verbose_ostream_manip</a></div><div class="ttdeci">const Function&lt; std::ostream &amp;(std::ostream &amp;)&gt; m_verbose_ostream_manip</div><div class="ttdoc">ostream manipulator (argument to ostream &lt;&lt;) that will output packet info suitable for DATA log level...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00249">low_lvl_packet.hpp:249</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Low__lvl__packet_html_ae5bd1ed0883b4827d8a81d70c10fd271"><div class="ttname"><a href="structflow_1_1net__flow_1_1Low__lvl__packet.html#ae5bd1ed0883b4827d8a81d70c10fd271">flow::net_flow::Low_lvl_packet::m_src_port</a></div><div class="ttdeci">flow_port_t m_src_port</div><div class="ttdoc">Flow-protocol port # of socket in sending Node.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00232">low_lvl_packet.hpp:232</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Rst__packet_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Rst__packet.html">flow::net_flow::Rst_packet</a></div><div class="ttdoc">Internal net_flow struct that encapsulates the Flow-protocol low-level RST packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01329">low_lvl_packet.hpp:1330</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Rst__packet_html_a06e98008f816699dcd5c8890914a6b3f"><div class="ttname"><a href="structflow_1_1net__flow_1_1Rst__packet.html#a06e98008f816699dcd5c8890914a6b3f">flow::net_flow::Rst_packet::serialize_to_raw_data</a></div><div class="ttdeci">size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00374">low_lvl_packet.cpp:374</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Rst__packet_html_a171bf247cad883b73b4b76957dfe4994"><div class="ttname"><a href="structflow_1_1net__flow_1_1Rst__packet.html#a171bf247cad883b73b4b76957dfe4994">flow::net_flow::Rst_packet::Rst_packet</a></div><div class="ttdeci">Rst_packet(log::Logger *logger_ptr)</div><div class="ttdoc">The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00102">low_lvl_packet.cpp:102</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Rst__packet_html_a915e6803b36ae470e585b1bc90622079"><div class="ttname"><a href="structflow_1_1net__flow_1_1Rst__packet.html#a915e6803b36ae470e585b1bc90622079">flow::net_flow::Rst_packet::S_RAW_TYPE_ID</a></div><div class="ttdeci">static const uint8_t S_RAW_TYPE_ID</div><div class="ttdoc">In serialized packet, the type ID byte identifying this as an RST packet. Must not equal any other pa...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l01346">low_lvl_packet.hpp:1346</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Rst__packet_html_ae1292deb7eec0f01d3ff111977ff5693"><div class="ttname"><a href="structflow_1_1net__flow_1_1Rst__packet.html#ae1292deb7eec0f01d3ff111977ff5693">flow::net_flow::Rst_packet::deserialize_type_specific_data_from_raw_data_packet</a></div><div class="ttdeci">bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00892">low_lvl_packet.cpp:892</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html">flow::net_flow::Syn_ack_ack_packet</a></div><div class="ttdoc">Internal net_flow struct that encapsulates the Flow-protocol low-level SYN_ACK_ACK packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00792">low_lvl_packet.hpp:793</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_a0f2665713bcedc20db1365412630ff6f"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a0f2665713bcedc20db1365412630ff6f">flow::net_flow::Syn_ack_ack_packet::to_ostream</a></div><div class="ttdeci">std::ostream &amp; to_ostream(std::ostream &amp;os, bool verbose) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00957">low_lvl_packet.cpp:957</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_a15bb98c2c3c00dc2c2db7f76a932d65c"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a15bb98c2c3c00dc2c2db7f76a932d65c">flow::net_flow::Syn_ack_ack_packet::deserialize_type_specific_data_from_raw_data_packet</a></div><div class="ttdeci">bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00613">low_lvl_packet.cpp:613</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_a1a0bad5bc4e9c966709f7bc8a2469bf6"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a1a0bad5bc4e9c966709f7bc8a2469bf6">flow::net_flow::Syn_ack_ack_packet::m_packed</a></div><div class="ttdeci">struct flow::net_flow::Syn_ack_ack_packet::@9 m_packed</div><div class="ttdoc">Packed group affected by #pragma pack.</div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_a3a3a3d676ec71eee0d2daa56a3b73403"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a3a3a3d676ec71eee0d2daa56a3b73403">flow::net_flow::Syn_ack_ack_packet::m_rcv_wnd</a></div><div class="ttdeci">rcv_wnd_t m_rcv_wnd</div><div class="ttdoc">Same meaning as in Syn_ack_packet but applied to the essentially independent opposite traffic directi...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00810">low_lvl_packet.hpp:810</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_a817e22c18b67db0e2e4794b962e4365d"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a817e22c18b67db0e2e4794b962e4365d">flow::net_flow::Syn_ack_ack_packet::serialize_to_raw_data</a></div><div class="ttdeci">size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00258">low_lvl_packet.cpp:258</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_a86707d5efb4b1b5ad056a4255976e262"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#a86707d5efb4b1b5ad056a4255976e262">flow::net_flow::Syn_ack_ack_packet::Syn_ack_ack_packet</a></div><div class="ttdeci">Syn_ack_ack_packet(log::Logger *logger_ptr)</div><div class="ttdoc">The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00082">low_lvl_packet.cpp:82</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_ab2537625fa282f302e586dee1c24cd19"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#ab2537625fa282f302e586dee1c24cd19">flow::net_flow::Syn_ack_ack_packet::m_security_token</a></div><div class="ttdeci">security_token_t m_security_token</div><div class="ttdoc">This must equal Syn_ack_packet m_security_token received in the packet to which *this is replying.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00804">low_lvl_packet.hpp:804</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__ack__packet_html_ade7cf2a204f400633f079bed7b4b4972"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__ack__packet.html#ade7cf2a204f400633f079bed7b4b4972">flow::net_flow::Syn_ack_ack_packet::S_RAW_TYPE_ID</a></div><div class="ttdeci">static const uint8_t S_RAW_TYPE_ID</div><div class="ttdoc">In serialized packet, the type ID byte identifying this as a SYN_ACK_ACK. Must not equal any other pa...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00823">low_lvl_packet.hpp:823</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html">flow::net_flow::Syn_ack_packet</a></div><div class="ttdoc">Internal net_flow struct that encapsulates the Flow-protocol low-level SYN_ACK packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00678">low_lvl_packet.hpp:679</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_a0535131057e39d7d9092156fa674b9d4"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a0535131057e39d7d9092156fa674b9d4">flow::net_flow::Syn_ack_packet::m_init_seq_num</a></div><div class="ttdeci">Sequence_number m_init_seq_num</div><div class="ttdoc">Same meaning as Syn_packet::m_init_seq_num but applied to the essentially independent opposite traffi...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00686">low_lvl_packet.hpp:686</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_a1ce651745da7f488ec0bcf3d4f3467a9"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a1ce651745da7f488ec0bcf3d4f3467a9">flow::net_flow::Syn_ack_packet::deserialize_type_specific_data_from_raw_data_packet</a></div><div class="ttdeci">bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00564">low_lvl_packet.cpp:564</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_a1ed3bdee2d19c2adaaf00fda9b5a7ca8"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a1ed3bdee2d19c2adaaf00fda9b5a7ca8">flow::net_flow::Syn_ack_packet::m_rcv_wnd</a></div><div class="ttdeci">rcv_wnd_t m_rcv_wnd</div><div class="ttdoc">Number of DATA payload bytes the sender of this packet would accept into its Receive buffer,...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00711">low_lvl_packet.hpp:711</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_a439f09a3ae4d1a5125781e220e29c39e"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a439f09a3ae4d1a5125781e220e29c39e">flow::net_flow::Syn_ack_packet::Syn_ack_packet</a></div><div class="ttdeci">Syn_ack_packet(log::Logger *logger_ptr)</div><div class="ttdoc">The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00076">low_lvl_packet.cpp:76</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_a46bb776a13c77d7109469c0c29565a30"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a46bb776a13c77d7109469c0c29565a30">flow::net_flow::Syn_ack_packet::m_security_token</a></div><div class="ttdeci">security_token_t m_security_token</div><div class="ttdoc">Random security token used during SYN_ACK-SYN_ACK_ACK.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00697">low_lvl_packet.hpp:697</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_a98fae8deebcd22c8397f2585de18ce9d"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a98fae8deebcd22c8397f2585de18ce9d">flow::net_flow::Syn_ack_packet::serialize_to_raw_data</a></div><div class="ttdeci">size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00234">low_lvl_packet.cpp:234</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_a9c98a61096d86196c073a232e432d03b"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#a9c98a61096d86196c073a232e432d03b">flow::net_flow::Syn_ack_packet::to_ostream</a></div><div class="ttdeci">std::ostream &amp; to_ostream(std::ostream &amp;os, bool verbose) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00946">low_lvl_packet.cpp:946</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_aaf2fa9221da49c413441aa8fec93ce91"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#aaf2fa9221da49c413441aa8fec93ce91">flow::net_flow::Syn_ack_packet::m_packed</a></div><div class="ttdeci">struct flow::net_flow::Syn_ack_packet::@8 m_packed</div><div class="ttdoc">Packed group affected by #pragma pack.</div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__ack__packet_html_ab6db0fded81c7002f0bd00e9388b09bd"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__ack__packet.html#ab6db0fded81c7002f0bd00e9388b09bd">flow::net_flow::Syn_ack_packet::S_RAW_TYPE_ID</a></div><div class="ttdeci">static const uint8_t S_RAW_TYPE_ID</div><div class="ttdoc">In serialized packet, the type ID byte identifying this as a SYN_ACK. Must not equal any other packet...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00727">low_lvl_packet.hpp:727</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html">flow::net_flow::Syn_packet</a></div><div class="ttdoc">Internal net_flow struct that encapsulates the Flow-protocol low-level SYN packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00583">low_lvl_packet.hpp:584</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html_a11ded0bc8596fb4adc815c5322e7ad26"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html#a11ded0bc8596fb4adc815c5322e7ad26">flow::net_flow::Syn_packet::to_ostream</a></div><div class="ttdeci">std::ostream &amp; to_ostream(std::ostream &amp;os, bool verbose) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00924">low_lvl_packet.cpp:924</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html_a1f0628c2e2d6d58b881b379a95fde441"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html#a1f0628c2e2d6d58b881b379a95fde441">flow::net_flow::Syn_packet::S_RAW_TYPE_ID</a></div><div class="ttdeci">static const uint8_t S_RAW_TYPE_ID</div><div class="ttdoc">In serialized packet, the type ID byte identifying this as a SYN packet. Must not equal any other pac...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00611">low_lvl_packet.hpp:611</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html_a943eb247f6c6a0de134e2d255feaf146"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html#a943eb247f6c6a0de134e2d255feaf146">flow::net_flow::Syn_packet::Syn_packet</a></div><div class="ttdeci">Syn_packet(log::Logger *logger_ptr)</div><div class="ttdoc">The implementation of Low_lvl_packet::create_uninit_packet() for this sub-type of Low_lvl_packet.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00069">low_lvl_packet.cpp:69</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html_abde26e74af2154fda517d6125353f305"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html#abde26e74af2154fda517d6125353f305">flow::net_flow::Syn_packet::m_serialized_metadata</a></div><div class="ttdeci">util::Blob m_serialized_metadata</div><div class="ttdoc">Arbitrary serialized user-supplied metadata to send in SYN, where it can be deserialized by the user ...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00603">low_lvl_packet.hpp:603</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html_aee4a61d5e344959abc89ee83ae105c8a"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html#aee4a61d5e344959abc89ee83ae105c8a">flow::net_flow::Syn_packet::deserialize_type_specific_data_from_raw_data_packet</a></div><div class="ttdeci">bool deserialize_type_specific_data_from_raw_data_packet(Const_buffer *raw_buf, bool prefer_no_move, util::Blob *raw_packet) override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00512">low_lvl_packet.cpp:512</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html_af235e53d05d025b0808b2ee677c0cba4"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html#af235e53d05d025b0808b2ee677c0cba4">flow::net_flow::Syn_packet::m_init_seq_num</a></div><div class="ttdeci">Sequence_number m_init_seq_num</div><div class="ttdoc">The Initial Sequence Number (ISN) of the sequence number line that the sender of this SYN will be usi...</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8hpp_source.html#l00594">low_lvl_packet.hpp:594</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Syn__packet_html_af72461ac0c304cd5ea2bb3fca2b3a444"><div class="ttname"><a href="structflow_1_1net__flow_1_1Syn__packet.html#af72461ac0c304cd5ea2bb3fca2b3a444">flow::net_flow::Syn_packet::serialize_to_raw_data</a></div><div class="ttdeci">size_t serialize_to_raw_data(Const_buffer_sequence *raw_bufs) const override</div><div class="ttdoc">Implements Low_lvl_packet API.</div><div class="ttdef"><b>Definition:</b> <a href="low__lvl__packet_8cpp_source.html#l00198">low_lvl_packet.cpp:198</a></div></div>
<div class="ttc" id="astructflow_1_1util_1_1Noncopyable_html"><div class="ttname"><a href="structflow_1_1util_1_1Noncopyable.html">flow::util::Noncopyable</a></div><div class="ttdoc">Useful as a no-unique-address private member to make a type noncopyable while keeping that type an ag...</div><div class="ttdef"><b>Definition:</b> <a href="util_2util_8hpp_source.html#l00073">util.hpp:74</a></div></div>
<div class="ttc" id="autil_2util_8hpp_html"><div class="ttname"><a href="util_2util_8hpp.html">util.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
